当前位置: 首页 > 科技观察

Flowable定时器的多种玩法

时间:2023-03-12 06:48:20 科技观察

今天我们就来说说Flowable中的定时器。1.流程定义的定时激活之前宋哥给小伙伴介绍流程定义的时候,流程定义之后就立即激活了。其实在流程定义的过程中,我们还可以设置一个激活时间,即流程定义后,不会立即激活(不激活不能根据这个流程定义创建新的流程),但是将在一定的固定时间延迟后被激活。代码如下:@RestControllerpublicclassProcessDeployController{@AutowiredRepositoryServicerepositoryService;@PostMapping("/deploy")publicRespBeandeploy(MultipartFilefile,StringtenantId)throwsIOException{System.out.println(newDate());DeploymentBuilderdeploymentBuilder=repositoryService.createDeployment().category("javaboy的工作流类别").name("javaboy的工作流名称").addInputStream("fff.bpmn",file.getInputStream()).tenantId(tenantId).activateProcessDefinitionsOn(newDate(System.currentTimeMillis()+1000*60)).key("javaboy'sworkflowkey666");部署deployment=deploymentBuilder.deploy();returnRespBean.ok("部署成功",deployment.getId());}}.activateProcessDefinitionsOn(newDate(System.currentTimeMillis()+1000*60))表示延迟一分钟后激活进程。这个时候我们启动项目,然后调用这个接口部署一个流程。当流程启动时,会抛出如下异常:可以看到,这里也很清楚流程定义当前处于挂起状态,无法启动。这时候,如果我们查看ACT_RU_TIMER_JOB表,就会发现表中多了一个定时任务执行计划:表中有一个DUEDATE_字段,描述了定时任务执行的具体时间。到达时间后,定时任务会自动执行,ACT_RE_PROCDEF表中进程的状态字段SUSPENSION_STATE_会由2变为1。2.进程实例的定时挂起除了进程实例的定时挂起流程定义,流程实例也可以定期暂停。方法如下:@AutowiredRepositoryServicerepositoryService;@Testvoidtest23(){repositoryService.suspendProcessDefinitionByKey("UserTaskDemo",true,newDate(System.currentTimeMillis()+120*1000));}执行完成后会也可以在ACT_RU_TIMER_JOB表中添加一个定时任务,两分钟后,流程定义和对应的流程会自动挂起。其实就是把对应表中的SUSPENSION_STATE_字段的值从1变成了2。3.在前面两节定时任务执行过程中,宋哥跟大家提到过,定时任务信息会保存在ACT_RU_TIMER_JOB中表,时间到了就会保存起来。自动执行。但是小伙伴们请注意,每次执行定时任务的时候,其实并不是查询ACT_RU_TIMER_JOB表中的数据,而是查询ACT_RU_JOB表中的数据并执行。当预定的时间到了,Flowable会自动将ACT_RU_TIMER_JOB表中的数据移动到ACT_RU_JOB表中,然后timer在查询到ACT_RU_JOB表中的数据后会立即自动执行。大致是这样的过程。我会手动给你看一个。我当前的流程定义和流程实例已暂停。我想在4分钟后全部启动它们。代码如下:@Testvoidtest24(){repositoryService.activateProcessDefinitionByKey("UserTaskDemo",true,newDate(System.currentTimeMillis()+240*1000));}这行代码执行时,4分钟后,流程定义和流程实例都已启动。但是现在突然不想等四分钟了,想马上执行,那我们可以去ACT_RU_TIMER_JOB表中找到这个定时任务的ID,然后执行下面的代码:@AutowiredManagementServicemanagementService;@testvoidtest25(){managementService.moveTimerToExecutableJob("b7e9501d-5075-11ed-9706-acde48001122");}这段代码的意思是将ID为b7e9501d-5075-11ed-9706-acde48001122的记录从ACT_RU_TIMER_JOB表中移动到ACT_RU_JOB表中。移动完成后,任务将立即执行。定时任务启动后,是否可以取消?当然!我们可以把这个定时任务放到私信队列列表中。私人消息队列列表是ACT_RU_DEADLETTER_JOB。具体操作方法如下:@Testvoidtest27(){managementService.moveJobToDeadLetterJob("6b95dc62-5081-11ed-a00f-acde48001122");}上述方法执行的参数为ACT_RU_TIMER_JOB表中的任务ID。执行完成后,ACT_RU_TIMER_JOB表中对应的记录会被移动到ACT_RU_DEADLETTER_JOB表中,所以定时任务不会执行。对于已经移到私有消息队列的定时任务,也可以移回ACT_RU_JOB表立即执行(即使时间还没到),如下:@Testvoidtest26(){managementService.moveDeadLetterJobToExecutableJob("6b95dc62-5081-11ed-a00f-acde48001122",10);}参数为任务ID。好了,几个简单的例子分享给小伙伴们如何在Flowable中玩定时器。有兴趣的朋友可以试试~