一、Activiti的流程分支条件的局限
Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:

<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
<conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
<conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
<conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>
从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:
1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写
2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。
以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:
JsonNode jsonObject=objectMapper.readTree(configJson);
JsonNode configsNode=jsonObject.get("configs");
BpmSolution bpmSolution=bpmSolutionManager.get(solId);
BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());
ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());
String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());
System.out.println("xml:"+processDefXml);
ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);

本文探讨了Activiti流程分支条件的局限性,包括在流程定义中设定和简单的boolean表达式。为解决这些问题,文章介绍了如何扩展Activiti,允许在分支判断中执行自定义脚本,以适应更复杂的业务需求。通过改写ExclusiveGateway节点行为,利用脚本引擎执行条件判断,并调整Activiti的Spring配置以使用新的流程行为动作工厂类。

735

被折叠的 条评论
为什么被折叠?



