Flowable定时器具体操作与配置方法详细解析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1398个文字,预计阅读时间需要6分钟。
目录 + 1. 流程定义:定时激活 + 2. 流程实例:定时挂起 + 3. 定时任务执行过程 + 1. 流程定义:定时激活 + 在流程定义阶段,设定激活时间,流程定义一旦完成,到了设定的时间就会自动激活。 + 实际操作中,流程定义良好后,一旦达到激活时间,流程便自动启动。
目录
- 1. 流程定义定时激活
- 2. 流程实例定时挂起
- 3. 定时任务执行过程
1. 流程定义定时激活
在之前松哥给小伙伴们介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的这个过程中,我们还可以设置一个激活时间,也就是流程定义好之后,并不会立马激活(不激活就不能据此流程定义创建新流程),而是在延迟某一个固定时间之后,才会激活,代码如下:
@RestController public class ProcessDeployController { @Autowired RepositoryService repositoryService; @PostMapping("/deploy") public RespBean deploy(MultipartFile file,String tenantId) throws IOException { System.out.println(new Date()); DeploymentBuilder deploymentBuilder = repositoryService.createDeployment() .category("javaboy的工作流分类") .name("javaboy的工作流名称") .addInputStream("fff.bpmn", file.getInputStream()) .tenantId(tenantId) .activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60)) .key("javaboy的工作流key666"); Deployment deployment = deploymentBuilder .deploy(); return RespBean.ok("部署成功",deployment.getId()); } }
.activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60))表示流程在延迟一分钟之后,才激活。
此时,我们启动项目,然后调用该接口部署一个流程,部署完成之后,如果立马调用流程启动方法去启动流程,就会抛出如下异常:
可以看到,这里也说的很明确了,这个流程定义目前是一个挂起的状态,无法启动。
这个时候,我们去查看ACT_RU_TIMER_JOB表,就会发现该表中多了一条定时任务执行计划:
该表有一个DUEDATE_字段,这个字段描述了这个定时任务执行的具体时间,在到达时间后,定时任务会自动执行,将ACT_RE_PROCDEF表中,流程的状态字段SUSPENSION_STATE_由 2 改为 1。
2. 流程实例定时挂起
除了流程定义可以定时挂起外,流程实例也可以定时挂起。方式如下:
@Autowired RepositoryService repositoryService; @Test void test23() { repositoryService.suspendProcessDefinitionByKey("UserTaskDemo", true, new Date(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 分钟之后,将之全部启动,代码如下:
@Test void test24() { repositoryService.activateProcessDefinitionByKey("UserTaskDemo", true, new Date(System.currentTimeMillis() + 240 * 1000)); }
当这行代码执行之后,4 分钟之后,流程定义和流程实例就全部都启动了。但是我现在忽然就不想等四分钟了,我想立马执行,那么我们可以去ACT_RU_TIMER_JOB表中找到这个定时任务的 ID,然后执行如下代码:
@Autowired ManagementService managementService; @Test void test25() { managementService.moveTimerToExecutableJob("b7e9501d-5075-11ed-9706-acde48001122"); }
这个代码表示将 ID 为b7e9501d-5075-11ed-9706-acde48001122的记录由ACT_RU_TIMER_JOB表移动到ACT_RU_JOB表中,移动完成后,这个任务就会被立马执行。
当一个定时任务开启了,还能不能取消呢?当然可以!我们将这个定时任务放到私信队列表即可,私信队列表是ACT_RU_DEADLETTER_JOB,具体操作方式如下:
@Test void test27() { managementService.moveJobToDeadLetterJob("6b95dc62-5081-11ed-a00f-acde48001122"); }
上面这个方法执行的参数是ACT_RU_TIMER_JOB表中的任务 ID,执行完成后,ACT_RU_TIMER_JOB表中对应的记录就会被移动到ACT_RU_DEADLETTER_JOB表中,所以定时任务就不会被执行了。
对于已经移动到私信队列的定时任务,也可以再通过如下方法移动回ACT_RU_JOB表中被立马执行(即使时间没到也会立马执行),如下:
@Test void test26() { managementService.moveDeadLetterJobToExecutableJob("6b95dc62-5081-11ed-a00f-acde48001122", 10); }
参数就是任务 ID。
到此这篇关于Flowable中定时器的玩法详解的文章就介绍到这了,更多相关Flowable定时器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计1398个文字,预计阅读时间需要6分钟。
目录 + 1. 流程定义:定时激活 + 2. 流程实例:定时挂起 + 3. 定时任务执行过程 + 1. 流程定义:定时激活 + 在流程定义阶段,设定激活时间,流程定义一旦完成,到了设定的时间就会自动激活。 + 实际操作中,流程定义良好后,一旦达到激活时间,流程便自动启动。
目录
- 1. 流程定义定时激活
- 2. 流程实例定时挂起
- 3. 定时任务执行过程
1. 流程定义定时激活
在之前松哥给小伙伴们介绍流程定义的时候,流程都是定义好之后立马就激活了,其实在流程定义的这个过程中,我们还可以设置一个激活时间,也就是流程定义好之后,并不会立马激活(不激活就不能据此流程定义创建新流程),而是在延迟某一个固定时间之后,才会激活,代码如下:
@RestController public class ProcessDeployController { @Autowired RepositoryService repositoryService; @PostMapping("/deploy") public RespBean deploy(MultipartFile file,String tenantId) throws IOException { System.out.println(new Date()); DeploymentBuilder deploymentBuilder = repositoryService.createDeployment() .category("javaboy的工作流分类") .name("javaboy的工作流名称") .addInputStream("fff.bpmn", file.getInputStream()) .tenantId(tenantId) .activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60)) .key("javaboy的工作流key666"); Deployment deployment = deploymentBuilder .deploy(); return RespBean.ok("部署成功",deployment.getId()); } }
.activateProcessDefinitionsOn(new Date(System.currentTimeMillis() + 1000 * 60))表示流程在延迟一分钟之后,才激活。
此时,我们启动项目,然后调用该接口部署一个流程,部署完成之后,如果立马调用流程启动方法去启动流程,就会抛出如下异常:
可以看到,这里也说的很明确了,这个流程定义目前是一个挂起的状态,无法启动。
这个时候,我们去查看ACT_RU_TIMER_JOB表,就会发现该表中多了一条定时任务执行计划:
该表有一个DUEDATE_字段,这个字段描述了这个定时任务执行的具体时间,在到达时间后,定时任务会自动执行,将ACT_RE_PROCDEF表中,流程的状态字段SUSPENSION_STATE_由 2 改为 1。
2. 流程实例定时挂起
除了流程定义可以定时挂起外,流程实例也可以定时挂起。方式如下:
@Autowired RepositoryService repositoryService; @Test void test23() { repositoryService.suspendProcessDefinitionByKey("UserTaskDemo", true, new Date(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 分钟之后,将之全部启动,代码如下:
@Test void test24() { repositoryService.activateProcessDefinitionByKey("UserTaskDemo", true, new Date(System.currentTimeMillis() + 240 * 1000)); }
当这行代码执行之后,4 分钟之后,流程定义和流程实例就全部都启动了。但是我现在忽然就不想等四分钟了,我想立马执行,那么我们可以去ACT_RU_TIMER_JOB表中找到这个定时任务的 ID,然后执行如下代码:
@Autowired ManagementService managementService; @Test void test25() { managementService.moveTimerToExecutableJob("b7e9501d-5075-11ed-9706-acde48001122"); }
这个代码表示将 ID 为b7e9501d-5075-11ed-9706-acde48001122的记录由ACT_RU_TIMER_JOB表移动到ACT_RU_JOB表中,移动完成后,这个任务就会被立马执行。
当一个定时任务开启了,还能不能取消呢?当然可以!我们将这个定时任务放到私信队列表即可,私信队列表是ACT_RU_DEADLETTER_JOB,具体操作方式如下:
@Test void test27() { managementService.moveJobToDeadLetterJob("6b95dc62-5081-11ed-a00f-acde48001122"); }
上面这个方法执行的参数是ACT_RU_TIMER_JOB表中的任务 ID,执行完成后,ACT_RU_TIMER_JOB表中对应的记录就会被移动到ACT_RU_DEADLETTER_JOB表中,所以定时任务就不会被执行了。
对于已经移动到私信队列的定时任务,也可以再通过如下方法移动回ACT_RU_JOB表中被立马执行(即使时间没到也会立马执行),如下:
@Test void test26() { managementService.moveDeadLetterJobToExecutableJob("6b95dc62-5081-11ed-a00f-acde48001122", 10); }
参数就是任务 ID。
到此这篇关于Flowable中定时器的玩法详解的文章就介绍到这了,更多相关Flowable定时器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

