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

Flowable流程实例的暂停(暂停)和激活

时间:2023-04-01 20:39:13 Java

今天和小伙伴们聊聊流程的暂停和激活。这一块其实涉及两部分:流程定义的挂起和激活。流程实例的暂停和激活。如果定义的流程被挂起,则不能基于它创建新流程。如果流程实例被挂起,流程中的任务将无法执行。小伙伴们注意区分这两个概念(看过前面几篇文章的小伙伴应该对这两个概念比较放心)。我们分开来看。1.流程定义的挂起和激活1.1查询是否被挂起对于定义好的流程,我们可以通过以下方法查看该流程是否被挂起:@Testvoidtest05(){Listlist=repositoryService.createProcessDefinitionQuery().列表();for(ProcessDefinitionprocessDefinition:list){Stringid=processDefinition.getId();布尔暂停=repositoryService.isProcessDefinitionSuspended(id);if(suspended){logger.info("进程定义{}被暂停",processDefinition.getName());}else{logger.info("进程定义{}没有被挂起",processDefinition.getName());}}}这条查询SQL涉及到的表是ACT_RE_PROCDEF,其中包含一个名为SUSPENSION_STATE_的字段,表示进程是否挂起。如下图所示:1表示进程未挂起。1.2暂停执行下面的方法,可以暂停一个流程定义,如下:@Testvoidtest06(){Listlist=repositoryService.createProcessDefinitionQuery().list();for(ProcessDefinitionpd:list){repositoryService.suspendProcessDefinitionById(pd.getId());}}悬浮的原理其实很简单。就是到ACT_RE_PROCDEF表中,将SUSPENSION_STATE_字段的值设置为2,表示流程定义被挂起。我们可以看到流程定义何时被挂起。执行的SQL:从执行的SQL可以清楚的看到,要操作的表是ACT_RE_PROCDEF,修改的字段是SUSPENSION_STATE_,把这个字段的值改成2(不考虑乐观锁相关的REV_字段).对于一个挂起的流程定义,如果我们想相应地启动一个流程:@Testvoidtest01(){identityService.setAuthenticatedUserId("wangwu");ProcessInstancepi=runtimeService.startProcessInstanceByKey("离开");logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}这时候会抛出如下异常:这个异常很清楚,过程定义被暂停,无法打开新的流程实例。1.3激活已经挂起的流程定义,也可以通过以下方式激活:@Testvoidtest07(){Listlist=repositoryService.createProcessDefinitionQuery().list();for(ProcessDefinitionpd:list){repositoryService.activateProcessDefinitionById(pd.getId());}}激活的原理也很简单,就是到ACT_RE_PROCDEF表中,将SUSPENSION_STATE_字段的值设置为1,即流程定义被激活。我们可以看到当流程定义被激活时执行的是什么SQL:注意操作的表、字段和对应的参数。2.流程实例的暂停和激活一旦你理解了第一部分,第二部分就会容易得多。2.1挂起挂起流程实例的方式如下:@Testvoidtest08(){Listlist=repositoryService.createProcessDefinitionQuery().list();for(ProcessDefinitionpd:list){repositoryService.suspendProcessDefinitionById(pd.getId(),true,null);}}可以看到,其实就是上面的方法,只不过这里多了两个参数:第二个参数true表示是否挂起这个流程定义实例对应的所有进程,true表示pending。第三个参数null表示进程挂起的具体时间。如果该参数为空,进程将立即挂起。如果参数是具体的日期,过期后进程会被挂起,但这需要jobexecutor的支持,关于jobexecutor,后面宋哥会单独发一篇文章介绍给小伙伴们。执行完成后,流程实例被挂起。流程实例被挂起,涉及两个地方:流程的执行实例被挂起。进程的任务被挂起。即ACT_RU_EXECUTION表中对应的流程实例会先被挂起:最后一列的两个2表示这两个执行实例被挂起。同时流程实例的Task实际上是挂起的,即ACT_RU_TASK表中对应的任务挂起,如下:可以看出SUSPENSION_STATE_字段的值为2,说明Task是也暂停了。让我们看一下流程实例挂起时执行的SQL:注意流程定义本身也被挂起。对于处于挂起状态的流程实例,是无法继续执行的。如果强制执行,则如下:@Testvoidtest03(){Listlist=taskService.createTaskQuery().taskAssignee("wangwu").list();for(Tasktask:list){taskService.complete(task.getId());}}会抛出一个异常,如下:这个异常也很明确的说明一个pendingTask无法完成。2.2激活挂起状态的流程实例,可以通过以下方式激活:@Testvoidtest09(){Listlist=repositoryService.createProcessDefinitionQuery().list();for(ProcessDefinitionpd:list){repositoryService.activateProcessDefinitionById(pd.getId(),true,null);}}一共有三个参数:流程定义的ID。是否激活流程定义对应的流程实例。流程实例的激活时间,null表示立即激活,如果是特定时间,则过期激活,但是和之前一样,这里也需要jobexecutor的支持。激活是逆向操作,将ACT_RU_EXECUTION、ACT_RU_TASK和ACT_RE_PROCDEF表中的SUSPENSION_STATE_字段值重新改为1。对应的SQL如下:好了,挂起和激活就说这么多,下篇继续~