一.简介
要实现流程实例的挂起和激活,首先要知道什么是流程实例的挂起和激活。
挂起:
①一个定义好的流程模板(流程定义),如果挂起了,那么就无法据此创建新的流程实例。
② 一个流程实例如果挂起了,那么就无法执行流程中的任务。
激活:
就跟挂起是相反的。
二.流程模板(流程定义)的挂起
1.查询是否挂起
对于一个定义好的流程模板,可以通过如下代来查看这个流程是否挂起:
@Test
void test05() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition processDefinition : list) {
String id = processDefinition.getId();
boolean suspended = repositoryService.isProcessDefinitionSuspended(id);
if (suspended) {
logger.info("流程定义 {} 已挂起",processDefinition.getName());
}else{
logger.info("流程定义 {} 未挂起",processDefinition.getName());
}
}
}
这个查询 SQL 涉及到的表是 ACT_RE_PROCDEF,该表中有一个名为 SUSPENSION_STATE_ 的字段,该字段表示这个流程是否挂起。如下图:
1 表示流程没有挂起。
2.挂起
执行如下方法,可以挂起一个流程模板(流程定义),代码如下:
@Test
void test06() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.suspendProcessDefinitionById(pd.getId());
}
}
挂起的原理其实很简单,就是去 ACT_RE_PROCDEF 表中,将 SUSPENSION_STATE_ 字段的值设置为 2,就表示这个流程定义挂起了,我们可以看下流程定义挂起时执行的 SQL:
从这个执行的 SQL 中我们可以清晰的看到,操作的表是 ACT_RE_PROCDEF,修改的字段就是 SUSPENSION_STATE_,将该字段的值修改为 2(乐观锁相关的 REV_ 字段不考虑)。
对于一个已经挂起的流程定义,如果我们想据此启动一个流程,如下:
@Test
void test01() {
identityService.setAuthenticatedUserId("wangwu");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
此时就会抛出如下异常:
这个异常说的很明白了,流程定义被挂起了,无法开启一个新的流程实例。
3.激活
已经挂起的流程定义,还可以激活,方式如下:
@Test
void test07() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.activateProcessDefinitionById(pd.getId());
}
}
激活的原理也很简单,,就是去 ACT_RE_PROCDEF 表中,将 SUSPENSION_STATE_ 字段的值设置为 1,就表示这个流程定义激活了,我们可以看下流程定义激活时执行的 SQL:
注意看操作的表、字段以及对应的参数。