当前位置: 首页 > 后端技术 > Java

Flowable定时器的多种玩法

时间:2023-04-01 16:01:49 Java

@[toc]今天我们就来说说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))表示延迟一分钟后激活进程。这个时候我们启动项目然后调用这个接口Deploy一个进程。部署完成后,如果立即调用processstart方法启动进程,会抛出如下异常:[Externallinkimagedumping...(img-xSdTE0BE-1668358373729)]可以看到也说了这里很明显这个流程定义目前处于挂起状态,无法启动。这时候我们查看ACT_RU_TIMER_JOB表,会发现表中多了一个定时任务执行计划:[外链图片转...(img-d73ZciiZ-1668358373730)]这个表有一个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表中,然后定时器查询到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中玩定时器。有兴趣的朋友可以试试~