springboot,Flowable 流程实例的激活与挂起(二)

news/2024/11/23 1:39:47/

一.简介

接上一篇 springboot,Flowable 流程实例的激活与挂起(一)

二.流程实例的挂起与激活

1.流程实例的挂起

挂起一个流程实例的代码如下:

@Test
void test08() {List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();for (ProcessDefinition pd : list) {repositoryService.suspendProcessDefinitionById(pd.getId(), true, null);}
}

其实还是挂起流程模板(流程定义)的那个方法,只不过这里多了两个参数:

第一个参数:流程模板(流程定义)的 ID
第二个参数 true 表示是否要挂起这个流程定义对应的所有的流程实例,true 表示挂起。
第三个参数 null 表示流程挂起的具体时间,如果该参数为 null,则流程会被立马挂起,如果该参数是一个具体的日期,则到期之后流程才会被挂起,但是这个需要 job executor 的支持。

执行完成之后,这个流程实例就被挂起了。流程实例被挂起,涉及到两个地方:

流程的执行实例被挂起。
流程的 Task 被挂起。

也就是首先 ACT_RU_EXECUTION 表中对应的流程实例会被挂起:
在这里插入图片描述
最后一列两个 2 就说明这两个执行实例被挂起了。

同时,流程实例的 Task 其实也被挂起了,即 ACT_RU_TASK 表中与之对应的任务被挂起了,如下:
在这里插入图片描述
注意,流程定义本身也被挂起了。

对于处于挂起状态的流程实例,是无法继续执行的,如果强行执行,代码如下:

@Test
void test03() {List<Task> list = taskService.createTaskQuery().taskAssignee("wangwu").list();for (Task task : list) {taskService.complete(task.getId());}
}

执行后会抛出异常,如下:
在这里插入图片描述
这个异常意思是无法完成一个处于挂起状态的 Task。

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 test09() {List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();for (ProcessDefinition pd : list) {repositoryService.activateProcessDefinitionById(pd.getId(), true, null);}
}

其实还是激活流程模板(流程定义)的那个方法,只不过这里多了两个参数:

第一个参数:流程模板(流程定义)的 ID
第二个参数 true 表示是否要激活这个流程定义对应的所有的流程实例,true 表示激活。
第三个参数 null 表示流程激活的具体时间,如果该参数为 null,则流程会被立马激活,如果该参数是一个具体的日期,则到期之后流程才会被激活,但是这个需要 job executor 的支持。

激活就是反向操作,将 ACT_RU_EXECUTION、ACT_RU_TASK 以及 ACT_RE_PROCDEF 表中的 SUSPENSION_STATE_ 字段值再改为 1。对应的 SQL 如下:
在这里插入图片描述


http://www.ppmy.cn/news/51368.html

相关文章

安全测试:配置管理潜在威胁

一、配置管理威胁有哪些 明文信息传输漏洞敏感信息泄露默认或可猜解用户账户会话重放攻击测试验证码缺陷http方法测试 二、明文信息传输和存储漏洞 漏洞描述&#xff1a; 页面中没有对传输的用户名和密码等敏感信息进行加密后传输。用户密码后台存储是否加密。 产生原因&a…

手写axios源码系列二:创建axios函数对象

文章目录 一、模块化目录介绍二、创建 axios 函数对象1、创建 axios.js 文件2、创建 defaults.js 文件3、创建 _Axios.js 文件4、总结 当前篇章正式进入手写 axios 源码系列&#xff0c;我们要真枪实弹的开始写代码了。 因为 axios 源码的代码量比较庞大&#xff0c;所以我们这…

mall-swarm微服务商城系统

mall-swarm是一套微服务商城系统&#xff0c;采用了 Spring Cloud 2021 & Alibaba、Spring Boot 2.7、Oauth2、MyBatis、Docker、Elasticsearch、Kubernetes等核心技术&#xff0c;同时提供了基于Vue的管理后台方便快速搭建系统。mall-swarm在电商业务的基础集成了注册中心…

Python数据结构与算法-欧几里算法(p95)

一、欧几里算法原理 欧几里得公式 欧几里得算法&#xff1a;gcd(a,b) gcd(b, a mod b) &#xff1b; mod是指模&#xff0c;即a/b取余数。 运算示例&#xff1a; gcd&#xff08;60,21&#xff09; gcd(21,18) gcd(18,3)gcd(3,0) 证明略 最大公约数-欧几里得求解 &#xff08…

一致性 Hash 算法 及Java TreeMap 实现

1、一致性 Hash 算法原理 一致性 Hash 算法通过构建环状的 Hash 空间替线性 Hash 空间的方法解决了这个问题&#xff0c;整个 Hash 空间被构建成一个首位相接的环。 其具体的构造过程为&#xff1a; 先构造一个长度为 2^32 的一致性 Hash 环计算每个缓存服务器的 Hash 值&…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日&#xff0c;以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办&#xff0c;众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间&#xff0c;移动云深入践行“为国建云”的使命&#xff0c;推出“六大”服…

数字ic验证工程师经典笔试面试题(含答案)

数字ic验证工程师在找工作时&#xff0c;刷笔试面试题必不可少&#xff0c;在面试前做好充足的准备才能抓住更多的机会&#xff0c;今天小编为大家准备了数字ic验证工程师大厂面试常用笔试面试题。 下列关于代码覆盖率描述错误的是&#xff1a;CD A.代码覆盖率包括语句覆盖率…

数仓建设规划核心问题!

小A进入一家网约车出现服务公司&#xff0c;负责公司数仓建设&#xff0c;试用期主要一项 OKR是制定数据仓库建设规划&#xff1b;因此小 A 本着从问题出发为原点&#xff0c;先对公司数仓现状进行一轮深入了解&#xff0c;理清存在问题&#xff0c;然后在以不忘初心原则提出解…