flowable实现多实例节点的自由跳转
最近弃用activiti,改用flowable,发现在实现多节点实例自由跳转时,有很大区别。
自由跳转整理如下:
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.FlowableEngineAgenda;
import org.flowable.engine.impl.cmd.NeedsActiveTaskCmd;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;import java.util.List;
import java.util.Map;/*** @description: 自由跳转流程* @author: starmark* @create: 2018-10-13 09:22**/
public class ActJumpTaskCmd extends NeedsActiveTaskCmd<Boolean> {protected String processId;//执行实例idprotected String targetNodeId;//目标节点protected Map<String, Object> formData;//变量protected String operationCode;public ActJumpTaskCmd(String taskId, String processId, String targetNodeId, Map<String, Object> formData,String operationCode) {super(taskId);this.processId = processId;this.targetNodeId = targetNodeId;this.formData = formData;this.operationCode=operationCode;}@Overrideprotected Boolean execute(CommandContext commandContext, TaskEntity task) {ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();ExecutionEntity rootExecution= executionEntityManager.findChildExecutionsByParentExecutionId(processId).get(0);CommandContextUtil.getTaskService().deleteTask(task, true);List<ExecutionEntity> executionEntityList= executionEntityManager.findChildExecutionsByParentExecutionId(rootExecution.getId());for(ExecutionEntity executionEntity:executionEntityList){List<ExecutionEntity> executionEntityList2= executionEntityManager.findChildExecutionsByParentExecutionId(executionEntity.getId());for(ExecutionEntity executionEntity2:executionEntityList2){CommandContextUtil.getTaskService().deleteTasksByExecutionId(executionEntity2.getId());executionEntityManager.deleteChildExecutions(executionEntity2,"delete",true);executionEntityManager.delete(executionEntity2);CommandContextUtil.getVariableService().deleteVariablesByExecutionId(executionEntity2.getId());}CommandContextUtil.getTaskService().deleteTasksByExecutionId(executionEntity.getId());executionEntityManager.deleteChildExecutions(executionEntity,"delete",true);executionEntityManager.delete(executionEntity);CommandContextUtil.getVariableService().deleteVariablesByExecutionId(executionEntity.getId());}Process process = ProcessDefinitionUtil.getProcess(rootExecution.getProcessDefinitionId());FlowElement targetFlowElement = process.getFlowElement(targetNodeId);rootExecution.setCurrentFlowElement(targetFlowElement);FlowableEngineAgenda agenda = CommandContextUtil.getAgenda();agenda.planContinueProcessInCompensation(rootExecution);return true;}}
看完代码,我们再说说过程,流程实例的驱动主要是靠表act_ru_execution来驱动的。前后跳转主要操作以下步骤:
- 清除相关任务(act_ru_task)
- 清除局部变量(act_ru_variable),注意是局部变量
- 清除轨迹(act_ru_execution)
- 保留act_ru_execution到只剩下两条记录再往下驱动流程.
注意:activti自由跳转也是同样的道理.
有朋友私信我,说我的代码不支持并行分支的驳回,这个确实是这样。
但并行分支的驳回有两种。
- 分支内的驳回,即驳回前有多少条分支,驳回后还是有多少条分支,研究一下act_ru_execution,看清哪些数据再处理
- 分支外的驳回,即原来有5条分支,可能驳回后只有一条。这样的话,还是删除掉act_ru_execution到只剩下两条记录即可.
后续有空,我再考虑这两种驳回吧!
flowable实现多实例节点的自由跳转相关推荐
- Flowable6.5 节点自由跳转
Flowable6已经实现了流程节点间的跳转,本次就初探一下相关的API. 相关的示例代码在Flowable的开源代码中可以找到,具体的位置如下: \modules\flowable-engine\s ...
- flowable工作流节点总是自动跳过
在监听器中的代码已经查询到审批人, 但是节点还是会跳过 这是啥情况啊? flowable总会出现第一节点跳过的情况 重启服务器后就没这个情况了
- 物联网平台企业版:设备接入实例节点开发实战——实践类
IoT物联网平台-实例化开发实战 前言 物联网平台企业版支持用户创建实例,用于设备接入和业务管理.企业版有一下优势: 根据业务规模,购买匹配的实例规格,可大幅节约您的成本. 实例规格按需选择,避免触达 ...
- flowable 实现多实例-会签-动态配置人员 参考demo
会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...
- flowable 动态多实例
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http:// ...
- flowable modler为任务节点增加自定义属性
如何在modler设计器中为任务节点,添加自定义的属性. 文章目录 1.modler设计器中所有元素的定义 2.flowable如何处理stencilset_bpmn.json文件 3.为UserTa ...
- IDEA中安装Free Mybatis plugin插件实现从dao层到mapper层自由跳转
场景 Free Mybatis plugin mybatis 插件,让你的mybatis.xml像java代码一样编辑.我们开发中使用mybatis时时长需要通过mapper接口查找对应的xml中的s ...
- Brainstorm (头脑风暴)软件
什么是头脑风暴? 当一群人围绕一个特定的兴趣领域产生新观点的时候,这种情境就叫做头脑风暴.由于会议使用了没有拘束的规则,人们就能够更自由地思考,进入思想的新区域,从而产生很多的新观点和问题解决方法. ...
- [转]Brainstorm (头脑风暴)软件
什么是头脑风暴? 当一群人围绕一个特定的兴趣领域产生新观点的时候,这种情境就叫做头脑风暴.由于会议使用了没有拘束的规则,人们就能够更自由地思考,进入思想的新区域,从而产生很多的新观点和问题解决方法. ...
- 云呼叫中心系统的功能
云呼叫中心是由云计算和通信技术,以互联网接入为手段,可支持语音.多媒体通信方式的-体化呼叫平台,具有快速部署.节约成本等显著优势.硬件部分主要包括CTI服务器.IVR/IFR服务器.数据库/应用服务器 ...
最新文章
- linux expect 自动交互 执行命令 超时 不完整 中断 解决方法
- 网站更新的文章如何被百度快速收录?
- 如何生成文件夹目录树文件
- 关于intent-filter的误区
- muduo网络库学习(六)缓冲区Buffer及TcpConnection的读写操作
- 【阿里妈妈数据科学系列】第五篇:实验指标设定方法与指标体系构建
- mysql 触发器_MySQL入门之触发器
- CString转化问题
- 【深入浅出etcd系列】1. 架构概览
- (step3.3) hdu 1059(Dividing——多重背包)
- 数学建模-12.预测模型
- 随题而学(二)多维数组转一维数组
- 搞清字符集和字符编码
- HTML5 浏览器大小缩放到一定大小固定页面
- 2022年最新河南建筑安全员模拟题库及答案
- Yii中处理前后台登录新方法 | 饭饭博客
- 矩阵对角线求和C++
- C51单片机之keil编程入门(一)
- 微博图床php上传,使用新浪微博图床
- 4 分钟,快速了解声网 Agora SDK 3.0
热门文章
- 【优化预测】基于matlab蝙蝠算法优化SVM预测【含Matlab源码 141期】
- 【光学】基于matlab多缝夫琅禾费衍射【含Matlab源码 061期】
- cnn初学者—从这入门_使用Tensorflow为初学者使用CNN进行简单图像分类
- 台式计算机诞生,生物电脑 ①1946年,世界上第一台计算机诞生,这个庞然大物开创了一个电脑时代。从那时候起,人们不断革新、创造,把庞然大物的体积一减再减,现在我们所见的台式电脑、掌上电脑...
- 笔记本独显无输出_笔记本屏幕太小?如何拓展视野边界?
- 解决pip install 库 下载速度慢的问题
- linux内核提高系统实时性,Linux操作系统实时性分析及改进策略
- mysql5.6二进制包_MySQL 5.6版本二进制包多实例安装
- ajax 循环php数组,jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
- mysql数据库操作常用命令_MySQL数据库操作常用命令小结