摘要:跳转方法当前任务获取流程定义获取目标节点定义删除当前运行任务流程执行到来源节点删除当前运行时任务命令,并返回当前任务的执行对象这里继承了,主要时很多跳转业务场景下,要求不能时挂起任务。
前言
工作快2年的小白,如有错误,恳请大家批评指点,这也是开始写博客的一个初衷,能够在分享互动、知识梳理中进步。
之前工作的项目使用activiti5进行企业流程系统开发,现在这份工作也开始需要流程开发,了解到activiti6扔掉了原来的pvm,直接针对bpmn进行处理,性能有了一定的提升;也有看到flowable6,虽说是activiti原班人马出来的,但是实在太新了、用的人也少,小白不敢轻易下手,于是选择了activiti6。说了好多废话。。正题正题
最为安全可靠,不修改Activiti自身执行和流程定义对象,但是对于中国式流程的功能需求(驳回、回退等),经常是要求在没有连线的情况下完成跳转,灵活性不够。
2.动态修改流程定义环节的连线,然后执行跳转,完成后再恢复流程定义Activiti5中实现,文中第二种
Activiti6中实现
这种方法可以实现动态跳转,不需要修改Activiti自身执行,但是会动态修改系统中的流程定义缓存对象。理论上这会出现一个多线程下,全局变量不安全的问题。单个Activiti流程引擎中,流程定义缓存对象是被所有线程共用的,当一个应用服务器同时收到两个不同流程实例、同个流程定义、同个环节的任务提交请求。a要求驳回,所以该线程动态修改了流程定义;与此同时,b要求正常流转,但是执行过程中,依据的流程定义已被修改,可能导致b也走向了驳回。
Activiti5中实现
Activiti5中实现,文中第一种
这种方法即可以实现动态跳转,又没有动态修改流程定义带来的不安全问题,而activiti6中因为pvm下的包都删了,执行计划的代码也进行了改造,原来的方法就不可用了。没找到相关介绍,自己根据原先的思路,学习Activiti6源码,找到了实现的方法,下面提供代码。
//跳转方法 public void jump(String taskId){ //当前任务 Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); //获取流程定义 Process process = repositoryService.getBpmnModel(currentTask.getProcessDefinitionId()).getMainProcess(); //获取目标节点定义 FlowNode targetNode = (FlowNode)process.getFlowElement("startTask"); //删除当前运行任务 String executionEntityId = managementService.executeCommand(new DeleteTaskCmd(currentTask.getId())); //流程执行到来源节点 managementService.executeCommand(new SetFLowNodeAndGoCmd(targetNode, executionEntityId)); } ------------------ //删除当前运行时任务命令,并返回当前任务的执行对象id //这里继承了NeedsActiveTaskCmd,主要时很多跳转业务场景下,要求不能时挂起任务。可以直接继承Command即可 public class DeleteTaskCmd extends NeedsActiveTaskCmd最后{ public DeleteTaskCmd(String taskId){ super(taskId); } public String execute(CommandContext commandContext, TaskEntity currentTask){ //获取所需服务 TaskEntityManagerImpl taskEntityManager = (TaskEntityManagerImpl)commandContext.getTaskEntityManager(); //获取当前任务的来源任务及来源节点信息 ExecutionEntity executionEntity = currentTask.getExecution(); //删除当前任务,来源任务 taskEntityManager.deleteTask(currentTask, "jumpReason", false, false); return executionEntity.getId(); } public String getSuspendedTaskException() { return "挂起的任务不能跳转"; } } ------------------ //根据提供节点和执行对象id,进行跳转命令 public class SetFLowNodeAndGoCmd implements Command { private FlowNode flowElement; private String executionId; public SetFLowNodeAndGoCmd(FlowNode flowElement,String executionId){ this.flowElement = flowElement; this.executionId = executionId; } public Void execute(CommandContext commandContext){ //获取目标节点的来源连线 List flows = flowElement.getIncomingFlows(); if(flows==null || flows.size()<1){ throw new ActivitiException("回退错误,目标节点没有来源连线"); } //随便选一条连线来执行,时当前执行计划为,从连线流转到目标节点,实现跳转 ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(executionId); executionEntity.setCurrentFlowElement(flows.get(0)); commandContext.getAgenda().planTakeOutgoingSequenceFlowsOperation(executionEntity, true); return null; } }
以上就是对Activiti6实现自由跳转的介绍。后面会再继续介绍
1.以上述自由跳转为基础实现不改变原先任务id的驳回即处理人小王完成环节A的任务(id=6000)后,流程走到下一环节B生成任务(id=6004),任务(id=6004)处理人小张审核不通过执行驳回,流程流转回环节A,环节A重新生成一条id=6000的待处理人为小王的任务。
2.java类方式进行Activiti6配置、spring集成包括字体配置、自定义全局事件监听、流程定义自动部署开关配置
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76370.html
摘要:当一个根级的结束时,就会进行上述的缓存对象统一的持久化。解决的办法也很简单,改为监听,判断是否时需要修改的任务实体即可。这样后面要进行驳回时,只要通过这样关系表,马上就可以定位到要驳回到的任务了。 1.前言 本文内容主要为以下两点,因为内容有交叉,所以会放在一起介绍。 1.以自由跳转为基础实现不改变原先任务id的驳回关于Activiti6动态跳转可以查看我的另一篇文章Activiti...
摘要:如图流程引擎创建完成后,只会对进行操作,属性数据表存储整个流程引擎级别的数据初始化表结构时,会默认插入四条记录,流程部署测试流程部署,先把上面的流程引擎配置的注解改为。如图资源流程定义数据表这里面存放的就是我们部署的资源元数据信息。 关于activiti是什么,我这里就不多说了,我们直接上路,O(∩_∩)O哈哈~ 引擎配置 配置方式有好几种:1): /** * 获取默认的流程引擎实例...
摘要:升级版延迟深度链接技术相比,增加了一个判断,能在用户点击链接时判断设备是否安装了目标,如果没有安装,则跳转应用市场或者浏览器中引导下载,用户安装后再次实现的场景还原功能。 移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道、硬推广,不如从细节下手,用最快最简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛、缩短分享路径、优化用户体验,...
阅读 1436·2021-09-02 19:23
阅读 1586·2021-08-11 11:19
阅读 641·2019-08-30 15:55
阅读 1652·2019-08-30 12:50
阅读 2240·2019-08-30 11:23
阅读 2179·2019-08-29 13:13
阅读 1500·2019-08-28 18:13
阅读 3344·2019-08-26 11:53