最近弃用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自由跳转也是同样的道理.
    有朋友私信我,说我的代码不支持并行分支的驳回,这个确实是这样。
    但并行分支的驳回有两种。
  1. 分支内的驳回,即驳回前有多少条分支,驳回后还是有多少条分支,研究一下act_ru_execution,看清哪些数据再处理
  2. 分支外的驳回,即原来有5条分支,可能驳回后只有一条。这样的话,还是删除掉act_ru_execution到只剩下两条记录即可.
    后续有空,我再考虑这两种驳回吧!

flowable实现多实例节点的自由跳转相关推荐

  1. Flowable6.5 节点自由跳转

    Flowable6已经实现了流程节点间的跳转,本次就初探一下相关的API. 相关的示例代码在Flowable的开源代码中可以找到,具体的位置如下: \modules\flowable-engine\s ...

  2. flowable工作流节点总是自动跳过

    在监听器中的代码已经查询到审批人, 但是节点还是会跳过 这是啥情况啊? flowable总会出现第一节点跳过的情况 重启服务器后就没这个情况了

  3. 物联网平台企业版:设备接入实例节点开发实战——实践类

    IoT物联网平台-实例化开发实战 前言 物联网平台企业版支持用户创建实例,用于设备接入和业务管理.企业版有一下优势: 根据业务规模,购买匹配的实例规格,可大幅节约您的成本. 实例规格按需选择,避免触达 ...

  4. flowable 实现多实例-会签-动态配置人员 参考demo

    会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...

  5. flowable 动态多实例

    <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http:// ...

  6. flowable modler为任务节点增加自定义属性

    如何在modler设计器中为任务节点,添加自定义的属性. 文章目录 1.modler设计器中所有元素的定义 2.flowable如何处理stencilset_bpmn.json文件 3.为UserTa ...

  7. IDEA中安装Free Mybatis plugin插件实现从dao层到mapper层自由跳转

    场景 Free Mybatis plugin mybatis 插件,让你的mybatis.xml像java代码一样编辑.我们开发中使用mybatis时时长需要通过mapper接口查找对应的xml中的s ...

  8. Brainstorm (头脑风暴)软件

    什么是头脑风暴? 当一群人围绕一个特定的兴趣领域产生新观点的时候,这种情境就叫做头脑风暴.由于会议使用了没有拘束的规则,人们就能够更自由地思考,进入思想的新区域,从而产生很多的新观点和问题解决方法. ...

  9. [转]Brainstorm (头脑风暴)软件

    什么是头脑风暴? 当一群人围绕一个特定的兴趣领域产生新观点的时候,这种情境就叫做头脑风暴.由于会议使用了没有拘束的规则,人们就能够更自由地思考,进入思想的新区域,从而产生很多的新观点和问题解决方法. ...

  10. 云呼叫中心系统的功能

    云呼叫中心是由云计算和通信技术,以互联网接入为手段,可支持语音.多媒体通信方式的-体化呼叫平台,具有快速部署.节约成本等显著优势.硬件部分主要包括CTI服务器.IVR/IFR服务器.数据库/应用服务器 ...

最新文章

  1. linux expect 自动交互 执行命令 超时 不完整 中断 解决方法
  2. 网站更新的文章如何被百度快速收录?
  3. 如何生成文件夹目录树文件
  4. 关于intent-filter的误区
  5. muduo网络库学习(六)缓冲区Buffer及TcpConnection的读写操作
  6. 【阿里妈妈数据科学系列】第五篇:实验指标设定方法与指标体系构建
  7. mysql 触发器_MySQL入门之触发器
  8. CString转化问题
  9. 【深入浅出etcd系列】1. 架构概览
  10. (step3.3) hdu 1059(Dividing——多重背包)
  11. 数学建模-12.预测模型
  12. 随题而学(二)多维数组转一维数组
  13. 搞清字符集和字符编码
  14. HTML5 浏览器大小缩放到一定大小固定页面
  15. 2022年最新河南建筑安全员模拟题库及答案
  16. Yii中处理前后台登录新方法 | 饭饭博客
  17. 矩阵对角线求和C++
  18. C51单片机之keil编程入门(一)
  19. 微博图床php上传,使用新浪微博图床
  20. 4 分钟,快速了解声网 Agora SDK 3.0

热门文章

  1. 【优化预测】基于matlab蝙蝠算法优化SVM预测【含Matlab源码 141期】
  2. 【光学】基于matlab多缝夫琅禾费衍射【含Matlab源码 061期】
  3. cnn初学者—从这入门_使用Tensorflow为初学者使用CNN进行简单图像分类
  4. 台式计算机诞生,生物电脑 ①1946年,世界上第一台计算机诞生,这个庞然大物开创了一个电脑时代。从那时候起,人们不断革新、创造,把庞然大物的体积一减再减,现在我们所见的台式电脑、掌上电脑...
  5. 笔记本独显无输出_笔记本屏幕太小?如何拓展视野边界?
  6. 解决pip install 库 下载速度慢的问题
  7. linux内核提高系统实时性,Linux操作系统实时性分析及改进策略
  8. mysql5.6二进制包_MySQL 5.6版本二进制包多实例安装
  9. ajax 循环php数组,jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
  10. mysql数据库操作常用命令_MySQL数据库操作常用命令小结