
act_re_model 用于存放流程模型
act_re_procdef 用于存放流程定义
act_re_deployment 用于存放流程部署
act_ge_bytearray 用于存放各种二进制文件信息(包括流程模型的json,流程定义的xml以及他们各自对应的预览图以及流程进行中的数组参数)
act_re_procdef中会记录该流程定义所对应的部署id
同时,act_ge_bytearray中会记录流程定义所对应的xml和预览图(通过bytearray表中的deploymentId来记录),NAME字段会明确写出是xml还是预览图
也会记录流程模型所对应的json和预览图(act_re_model表中,EDITOR_SOURCE_VALUE_ID_记录的是json,EDITOR_SOURCE_EXTRA_VALUE_ID_记录的是预览图,都对应是act_ge_bytearray表中的ID)
execution是流程实例中的执行器,会有不止一个。
首先要说明,execution和task是两个独立的概念。
每一个节点正在进行的时候,必然会有一个execution停留在这个节点上,但是未必会有task
只有task类节点(如UserTask/EmailTask等等)会生成task(进行中的task存在act_ru_task表中),所以用task是否存在来判断该节点是否在进行是不妥当的。
但是task类节点通常会阻塞,等待人为调用接口来让其流转(最典型的就是UserTask),所以流转的接口才需要传入task。
这时候,task会进入act_hi_taskinst表中。
0首先一个流程实例启动,必然会有一个根execution(我们后面称为exec0)
1随后,exec0会生成一个子exec1并放置于流程图的开始节点(可以在act_ru_execution表中找到,父子execution使用表中的PARENT_ID_进行关联)。
2接着,exec1会根据流程图向前走。如果遇到并行网关,则会分裂。这里假设并行网关有两条支线,则会分裂出一个exec2
exec1和exec2分别走向并行网关的两条支线。最后在并行网关会合时,exec2被销毁。exec1继续复用,走下面的流程。
3根据流程图的不同,execution会分裂出若干个同级/子exection。例如上文提到的并行网关,以及后面要讲解的“调用活动”(callActivity)
下面有一个callActivity对应的例子图,可以参考。
未完待续
一、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=objectMapperreadTree(configJson);
JsonNode configsNode=jsonObjectget("configs");
BpmSolution bpmSolution=bpmSolutionManagerget(solId);
BpmDef bpmDef=bpmDefManagergetLatestBpmByKey(bpmSolutiongetDefKey(), ContextUtilgetCurrentTenantId());
ActProcessDef processDef=actRepServicegetProcessDef(bpmDefgetActDefId());
String processDefXml=actRepServicegetBpmnXmlByDeployId(bpmDefgetActDepId());
Systemoutprintln("xml:"+processDefXml);
ActNodeDef sourceNode=processDefgetNodesMap()get(nodeId);
ByteArrayInputStream is=new ByteArrayInputStream(processDefXmlgetBytes());
if(configsNode!=null){
//取得分支条件列表
JsonNode configs=configsNodeget("conditions");
if(configs!=null){
Iterator<JsonNode> it=configselements();
while(ithasNext()){
ObjectNode config=(ObjectNode)itnext();
String tmpNodeId=configget("nodeId")textValue();
String tmpCondition=configget("condition")textValue();
Element seqFlow=(Element)rootElselectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='"
+sourceNodegetNodeId()+"' and @targetRef='"+tmpNodeId+"']");
if(seqFlow==null) continue;
Element conditionExpress=(Element)seqFlowselectSingleNode("bpm:conditionExpression");
if(conditionExpress==null){
conditionExpress=seqFlowaddElement("conditionExpression");
conditionExpressaddAttribute("xsi:type", "tFormalExpression");
}else{
conditionExpressclearContent();
}
conditionExpressaddCDATA(tmpCondition);
}
}
}
//修改流程定义的XML,并且清空该流程定义的缓存
actRepServicedoModifyXmlAndClearCache(bpmDefgetActDefId(),bpmDefgetActDepId(), docasXML());
1BPMN 20模式的根元素是definitions元素。
多实例相关属性,以eclipse中的可视化图形 *** 作为例
Multil instance:
Sequential:执行顺序。必选项,可选值有true、false。用于设置多实例的执行顺序。True:多实例顺序执行,false:多实例并行
loop cardinality:循环基数。可选项。可以直接填整数,表示会签的人数。
Collection:集合。可选项。会签人数的集合,通常为list。和loop cardinality二选一
Element variable:元素变量。选择Collection时必选,为collection集合每次遍历的元素
Completion condition:完成条件。可选。Activiti会签有个特性,比如设置一个人完成后会签结束,那么其他人的代办任务都会消失。
>
以上就是关于activiti要点纪要全部的内容,包括:activiti要点纪要、怎么实现Activiti的分支条件的自定义配置、Activiti主流程各个属性说明BPMN 2.0等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)