Flowable—多实例任务:会签
多实例任务会签
什么是会签?
举个例⼦:⽐如我们有⼀个任务可能需要多⼈审批,审批通过的条件可能⽐较多样,⽐如五个⼈审批。3个⼈审批过了就算过了,再或者有⼀个⼈权限⽐较⾼,拥有⼀票否决权。
即是其余所有⼈都过了,他点了个否定就算不过了,这种就是会签。
我们从上⾯可以清楚看到,这个流程有两个任务节点,分别是多实例任务节点,和任务2. 任务2就是普通的userTask,多实例任务1 其实也是userTask,
只不过是参数设置不同罢了,下⾯我们上流程的xml定义⽂件。
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="/spec/BPMN/20100524/MODEL" xmlns:xsi="/2
001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:flowable="/bpmn" xmlns:bpmndi <process id="multiinstance" name="MultiInstance" isExecutable="true">
<documentation>测试多实例模型</documentation>
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<userTask id="sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95" name="多实例任务1" flowable:assignee="${assignee}" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee">
<loopCardinality>5</loopCardinality>
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.50}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-78DB6DB5-22CF-406D-9B4A-B4F14A7E062B" sourceRef="startEvent1" targetRef="sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95"></sequenceFlow>
<userTask id="sid-F1BBCD6F-3153-4139-9101-D3C8C2F6151C" name="任务2" flowable:formFieldValidation="true"></userTask>
<sequenceFlow id="sid-B452CC02-56EA-46D2-8485-FB5B788200C1" sourceRef="sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95" targetRef="sid-F1BBCD6F-3153-4139-9101-D3C8C2F6151C"></sequenceFlow>
<endEvent id="sid-15CEF7DC-E073-484D-9B36-4EB3DA9A059F"></endEvent>
<sequenceFlow id="sid-69D6B9D5-A369-4708-B74B-2DECD1D0F308" sourceRef="sid-F1BBCD6F-3153-4139-9101-D3C8C2F6151C" targetRef="sid-15CEF7DC-E073-484D-9B36-4EB3DA9A059F"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_multiinstance">
<bpmndi:BPMNPlane bpmnElement="multiinstance" id="BPMNPlane_multiinstance">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="90.0" y="150.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95" id="BPMNShape_sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95">
<omgdc:Bounds height="80.0" width="100.0" x="300.0" y="120.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-F1BBCD6F-3153-4139-9101-D3C8C2F6151C" id="BPMNShape_sid-F1BBCD6F-3153-4139-9101-D3C8C2F6151C">
<omgdc:Bounds height="80.0" width="100.0" x="630.0" y="125.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-15CEF7DC-E073-484D-9B36-4EB3DA9A059F" id="BPMNShape_sid-15CEF7DC-E073-484D-9B36-4EB3DA9A059F">
<omgdc:Bounds height="28.0" width="28.0" x="1095.0" y="151.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-69D6B9D5-A369-4708-B74B-2DECD1D0F308" id="BPMNEdge_sid-69D6B9D5-A369-4708-B74B-2DECD1D0F308">
<omgdi:waypoint x="729.9499999999999" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="1095.0" y="165.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-B452CC02-56EA-46D2-8485-FB5B788200C1" id="BPMNEdge_sid-B452CC02-56EA-46D2-8485-FB5B788200C1">
<omgdi:waypoint x="399.9499999999835" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="515.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="515.0" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="629.9999999999847" y="165.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-78DB6DB5-22CF-406D-9B4A-B4F14A7E062B" id="BPMNEdge_sid-78DB6DB5-22CF-406D-9B4A-B4F14A7E062B">
<omgdi:waypoint x="119.94999834279307" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="165.0"></omgdi:waypoint>
<omgdi:waypoint x="210.0" y="160.0"></omgdi:waypoint>
<omgdi:waypoint x="299.9999999999682" y="160.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
上⾯是整个流程定义,内容⽐较繁多,下⾯我们主要看⼀下多实例任务1的节点内容⽚段进⾏详解:
<userTask id="sid-AFB0AD6E-5B65-457F-8E99-F3B8104CBA95" name="多实例任务1" flowable:assignee="${assignee}" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" flowable:collection="assigneeList" flowable:elementVariable="assignee">
<loopCardinality>5</loopCardinality>
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.50}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
上⾯我们已经知道了,会签的应⽤场景,有点想投票⼀样的感觉,既然是多个⼈参与的场景,也就意味着这是⼀个多⼈的任务,所以就有了上⾯的多实例任务,什么叫多实例任
务呢?就是这个任务会产⽣多个实例,想java 的类和实例的关系⼀样,你需要多少个实例你new多少次这个类就⾏了。所以这个多实例任务是可以通过配置参数,来决定执⾏这
个任务的时候会产⽣多少个⼀样的任务的实例,来给每个指定⼈的⼈执⾏,然后汇总结果,来判断是否通过。也就是说还会有个条件来判断是否通过。
⾄于是多少个实例呢?这个是通过
<loopCardinality>5</loopCardinality>
配置的吗,这⾥我们配置的是5个实例,也就是说要把它分给五个⼈执⾏。
flowable:assignee="${assignee}"
flowable:collection=“assigneeList”
flowable:elementVariable=“assignee”
values什么意思isSequential=“false”
理解了上⾯我们再看⼀下上⾯的属性
isSequential=“false”
false 代表并⾏,true代表串⾏,是什么意思呢?并⾏就是上⾯这5个任务可以同时执⾏,不受约束,串⾏就是⼀个个轮着来执⾏。
flowable:assignee="${assignee}"
该属性代表任务分配给谁,这⾥⽤的EL表达式,因为我们可能将五个不同的任务分配给五个不同的⼈,⽽且可能是我们运⾏时决定的(就是提前不能确定)。
flowable:collection=“assigneeList”
这⾥是⼀个运⾏时的变量的名字,举个例⼦我们运⾏时变量⾥⾯必须有个变量名字叫assigneeList
flowable:elementVariable=“assignee”
这⾥的assignee对应于上⾯的assigneeList, 如果 assigneeList是⼀个集合类型,那么assignee就对应于集合中的⼀个单元,然后,上⾯的EL表达式${assignee} 对应的就是这些单元。类似于Mybatis中的foreach标签。
<foreach collection="list" item="emp" separator=";">
INSERT INTO t_employee(username, gender, email) VALUES
(#{emp.username}, #{der}, #{ail})
</foreach>
assigneeList对应于上⾯的list, assignee对应于上⾯的emp。
<loopCardinality>5</loopCardinality>
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.50}</completionCondition>
loopCardinality
该属性的意思是这个任务循环的基数是多少,这个任务类型就是多实例任务,根据上⾯的解释,这个属性就是设置究竟是多少个实例的地⽅,⽐如我们需要五个⼈审批投票,然后就在这⾥设置个5就⾏了,为什么叫循环基数呢?就是因为如果我们的通过条件是3个⼈通过就ok的话,那么可能只需要3个实例就结束,进⼊到下⼀个环节了,⽽不是要5个实例。
completionCondition
完成的条件,这⾥就是设置这个多实例任务完成的地⽅,这⾥⾯你可以设置⾃⼰的结束条件,⽐如这⾥的条件:
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.50}</completionCondition>
这⾥仍然⽤的是EL表达式,这⾥⾯有两个变量:nrOfCompletedInstances和nrOfInstances,这⾥的nr是number的简写,所以你可以看明⽩这个条件是什么了,完成的任务实例超过实例的50%就算完成这个节点了。当然你也可以设置别的条件,可以通过EL表达式进⾏设置。
这⾥的变量nrOfCompletedInstances和nrOfInstances是系统⾃动⽣成的,要是你需要设置⾃⼰的变量吗,可以⾃⼰控制。
多实例任务的数据库状态
当我们启动⼀个上⾯的流程定义实例的时候传⼊的数据结构参数如下:
{
"deployId":"multiinstance:1:f9d0c4e2-2873-11ea-9aeb-1c872c5f4209",
"processKey":"multiinstance",
"processStarter":"sunlutong",
"varibales":{
"assigneeList":[
"m1",
"m2",
"m3",
"m4",
"m5"
]
}
}
实例化后,返回的流程实例ID是:22b6508d-2b76-11ea-af60-1c872c5f4209
进⼊到多实例任务节点之后,根据实例ID22b6508d-2b76-11ea-af60-1c872c5f4209。我们看⼀下实时的该实例的任务在表ACT_RU_TASK的数据表现:
我们可以看到上⾯⾃动⽣成了五个任务实例,assignee正是我们上⾯传⼊的参数assigneeList中的数据。
再来看⼀下多实例任务相关的实时的属性表,ACT_RU_VARIABLE表中的数据状态如下:
我们可以看到除了⾃⼰传⼊的参数assignee,assigneeList,会⾃动⽣成⼀些任务属性。
实际操作对应的数据表得变化
我们上⾯设置的完成属性是完成的实例超过50%就算完成了实例,也就是说我们只要完成三个实例就会结束多任务节点进⼊到任务2。
提交⼀个任务实例
ACT_RU_TASK表得数据:
我们可以看到此时上⾯的assignee的任务消失了。
ACT_RU_VARIABLE表得数据:
我们可以看到数据nrOfCompletedInstances变成了1,
在连续提交两个任务实例:
发现表ACT_RU_TASK和表ACT_RU_VARIABLE的多任务实例相关的数据都没了。
流程的进展如下:
以上就是会签。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论