[13]深入浅出工作开源框架Camunda:多实例并行用户任务
Posted 朱清云的技术博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[13]深入浅出工作开源框架Camunda:多实例并行用户任务相关的知识,希望对你有一定的参考价值。
Camunda提供了多实例并行用户任务,比如下面的并行多任务流程!
必须选择三条竖杠。
选择之后,就可以让“并行会签预审批”任务同时由多个人处理~
参考《基于camunda如何实现会签:camunda会签流程配置与原理解析》 大神写的文章,里面对并行用户任务
的主要参数配置进行了说明:
- loop cardinality:循环基数。可选项。可以直接填整数,表示会签的人数。
- Collection:集合。可选项。会签人数的集合,通常为list,和loop cardinality二选一。
- Element variable:元素变量。选择Collection时必选,为collection集合每次遍历的元素。
- Completion condition:完成条件。可选。比如设置一个人完成后会签结束,那么其他人的代办任务都会消失。
但是如果直接把上面的流程部署并启动,在“申请”用户任务点击"Complete[完成]"的时候,其会抛出下面的错误!
原因是没有对“并行会签预审批”任务里面的assigneeList 列表对象赋值!因为其会从流程实例的执行上下文中获取其对象。 解决的办法是加入一个动态的脚本:在任何一个Activity(活动)节点加入下面的一段脚本,比如启动任务。
def userList = ['user1', 'user2', 'user3'];
execution.setVariable("assigneeList", userList);
重新部署。
其整个BPMN的流程文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0gyepnf" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_Parallel-Multiple-Instance-0001" name="并行多实例会签" isExecutable="true">
<bpmn:startEvent id="StartEvent_1" name="开始">
<bpmn:extensionElements>
<camunda:executionListener event="start">
<camunda:script scriptFormat="groovy">def userList = ['user1', 'user2', 'user3'];execution.setVariable("assigneeList", userList);</camunda:script>
</camunda:executionListener>
</bpmn:extensionElements>
<bpmn:outgoing>Flow_0cwup88</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0cwup88" sourceRef="StartEvent_1" targetRef="Activity_04suznt" />
<bpmn:userTask id="Activity_04suznt" name="申请">
<bpmn:incoming>Flow_0cwup88</bpmn:incoming>
<bpmn:outgoing>Flow_10688hr</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_10688hr" sourceRef="Activity_04suznt" targetRef="Activity_huiqian0001" />
<bpmn:sequenceFlow id="Flow_0kw2ac2" sourceRef="Activity_huiqian0001" targetRef="Activity_1k8djx2" />
<bpmn:userTask id="Activity_huiqian0001" name="并行会签预审批" camunda:assignee="$assignee">
<bpmn:incoming>Flow_10688hr</bpmn:incoming>
<bpmn:outgoing>Flow_0kw2ac2</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="assigneeList" camunda:elementVariable="assignee" />
</bpmn:userTask>
<bpmn:endEvent id="Event_1sk7n99" name="结束">
<bpmn:incoming>Flow_1qdyb0n</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1qdyb0n" sourceRef="Activity_1k8djx2" targetRef="Event_1sk7n99" />
<bpmn:userTask id="Activity_1k8djx2" name="CEO审批">
<bpmn:incoming>Flow_0kw2ac2</bpmn:incoming>
<bpmn:outgoing>Flow_1qdyb0n</bpmn:outgoing>
</bpmn:userTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_Parallel-Multiple-Instance-0001">
<bpmndi:BPMNEdge id="Flow_0cwup88_di" bpmnElement="Flow_0cwup88">
<di:waypoint x="215" y="117" />
<di:waypoint x="270" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_10688hr_di" bpmnElement="Flow_10688hr">
<di:waypoint x="370" y="117" />
<di:waypoint x="430" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kw2ac2_di" bpmnElement="Flow_0kw2ac2">
<di:waypoint x="530" y="117" />
<di:waypoint x="590" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1qdyb0n_di" bpmnElement="Flow_1qdyb0n">
<di:waypoint x="690" y="117" />
<di:waypoint x="752" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="186" y="142" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_08yisz7_di" bpmnElement="Activity_04suznt">
<dc:Bounds x="270" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0hve660_di" bpmnElement="Activity_huiqian0001">
<dc:Bounds x="430" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1sk7n99_di" bpmnElement="Event_1sk7n99">
<dc:Bounds x="752" y="99" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="759" y="142" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0hql8n4_di" bpmnElement="Activity_1k8djx2">
<dc:Bounds x="590" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
当申请用户任务完成后,其会瞬间生成三个并行用户任务: user1,user2,user3每人一个。
这个时候,到数据库里面看看~
select ID_,NAME_, REV_, TASK_DEF_KEY_,ASSIGNEE_ , SUSPENSION_STATE_ from ACT_RU_TASK art where PROC_DEF_ID_ ='be0baf2c-d2ab-11ec-87de-005056c00008';
再执行
select ID_, REV_,ACT_ID_ , ACT_INST_ID_ , IS_ACTIVE_, BUSINESS_KEY_, IS_SCOPE_ ,SEQUENCE_COUNTER_,SUSPENSION_STATE_ from ACT_RU_EXECUTION where PROC_DEF_ID_ ='be0baf2c-d2ab-11ec-87de-005056c00008';
(1)User03 登录,审批通过一个,再看看数据库变化~
(2)User02 登录,审批通过一个,再看看数据库变化~
此时的历史表如下:
select ID_, ACT_ID_ ,ASSIGNEE_,ACT_NAME_ ,ACT_TYPE_ , ACT_INST_STATE_ ,SEQUENCE_COUNTER_ ,START_TIME_ ,END_TIME_
from ACT_HI_ACTINST where PROC_DEF_ID_ ='be0baf2c-d2ab-11ec-87de-005056c00008';
(3)User01 登录,审批通过一个,再看看数据库变化~
用户任务进入下一步了~
用户执行也进入下一步任务了
在看历史状态
(4)最后,把最后一步CEO审批通过,在看数据变化
select ID_,NAME_, REV_, TASK_DEF_KEY_,ASSIGNEE_ , SUSPENSION_STATE_ from ACT_RU_TASK art where PROC_DEF_ID_ =‘be0baf2c-d2ab-11ec-87de-005056c00008’;
运行中的任务执行结果为空
运行中的执行也为空
看看流程历史表里的数据:
至此,全部结束~
以上是关于[13]深入浅出工作开源框架Camunda:多实例并行用户任务的主要内容,如果未能解决你的问题,请参考以下文章
[14]深入浅出工作开源框架Camunda:多实例串行用户任务
[14]深入浅出工作开源框架Camunda:多实例串行用户任务