最近在研究一个轻量级的工作流引擎Activiti,就遇到了子流程中无法标记其并发节点的问题,经过几天的研究,想到了一个简单易懂的方法,总结如下,希望对你们能有所帮助,有写的不对的地方,还希望大家多提宝贵意见。
第一步:子流程处理。在子流程的并发节点之前添加一个自动完成的隐藏节点。
第二步:隐藏节点(上图的子流程标记节点)处理。将与子流程绑定的执行id(ExecutionId)存入当前节点的Variables。
在activiti中的工作原理中,对于一个流程来说,和其绑定是实例id;但是当遇到多个子流程时,它自动分配不同的执行id与每一个子流程相对应;与此同时,子流程中节点(除并发节点外)的执行id都和所在子流程的执行id保持一致。当遇到并发节点时,它又会自动分配出不同的执行id和每一个并发节点绑定,所以在并发节点上做处理时是找不到它所在子流程的执行id,这样就不能区分当前执行的并发节点是哪个子流程中的节点。故有以下做法,将隐藏节点中的流程标记传入其后面的并发节点中。
/*** 隐藏节点监听器* /public class SubFlowHiddenTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {//获得当前子流程的执行idString executionIdString = delegateTask.getExecutionId();//存入VariabledelegateTask.setVariable("flowIndex", executionIdString); }}
第三步:并发节点处理。在并发节点中获取流程标记。
/*** 并发节点监听器* /public class SubFlowConcurrencyTaskListener implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {//获得当前子流程的执行idMap<String, Object> map = delegateTask.getVariables();String flowIndex = (String) map.get("flowIndex");//其他操作······}}
这样就可以让每一个并发节点都有一个特定的归属了!!!