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:多实例并行用户任务相关推荐

  1. [7]深入浅出工作开源框架Camunda: camunda-webapp 用户登录功能代码分析

    在上个章节<[6]深入浅出工作开源框架Camunda: 如何远程Debug camunda-webapp的源代码>笔者解释了如何进行Camunda的远程Debug,这个章节笔者给大家分享如 ...

  2. [1]深入浅出工作开源框架Camunda: 安装和使用

    目前比较出名的开源工作流框架大概有4个,分别是Activiti/Camunda/Flowable/Jbpm.下面我们先抛开Jbpm框架,因为JBPM的二次开发难度比较大:笔者窃以为Camunda是一个 ...

  3. [15]深入浅出工作开源框架Camunda:定时任务

    1.引言 在BPMN中,可以通过改变"Timer Start Event" 启动节点的启动类型来自动启动流程实例. 其提供了下面三种定时自动触发流程实例的模式: 指定固定的时间点启 ...

  4. 【CV实战】年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架)...

    计算机视觉发展至今,许多技术已经非常成熟了,在各行各业落地业务非常多,因此不断的有新同学入行.本次我们就来介绍,对于新手来说,如何做一个最合适的项目.本次讲述一个完整的工业级别图像分类项目的标准流程, ...

  5. java oval 使用_java开源验证框架OVAL应用实例

    java开源验证框架OVAL应用实例 对oval验证框架进行分类,并针对常用的验证规则进行总结,从而可以抽象成模型可以定义,达到定义后自动生成,减少开发人员的工作量,同时也规范化代码结构. 1.  验 ...

  6. Android_开源框架_Volley实例

    2019独角兽企业重金招聘Python工程师标准>>> 1.自定义相关类 在 Android_开源框架_Volley(Google IO 2013)源代码及内部实现过程分析一文中,简 ...

  7. tomcat中request对象是被创建的_常用开源框架中设计模式使用分析(全)

    一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者可以简化代码,或者可以是代码逻辑开起来清晰,或者对功能扩展很 ...

  8. TensorFlow贡献者黄文坚:解读对比13个深度学习框架后的选择

    [AI创新者]TensorFlow贡献者黄文坚:解读对比13个深度学习框架后的选择 AI创新者 Google 人工智能 深度学习 TensorFlow 阅读5774  [AI创新者]是CSDN人工智能 ...

  9. .net core 基于Dapper 的分库分表开源框架(core-data)

    一.前言 感觉很久没写文章了,最近也比较忙,写的相对比较少,抽空分享基于Dapper 的分库分表开源框架core-data的强大功能,更好的提高开发过程中的效率:在数据库的数据日积月累的积累下,业务数 ...

最新文章

  1. itx机箱尺寸_乔思伯发布ITX机箱V8,采用独特抽拉式结构
  2. Lottie开源动画库
  3. AI:2020年6月23日北京智源大会演讲分享之智能信息检索与挖掘专题论坛——09:55-10:40刘兵教授《Open-World AI and Continual Learning》
  4. 网络安全比赛理论答题(三)
  5. echart triggeron设置两个方法_6个超实用方法:打造PPT立体空间感
  6. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)
  7. iOS开发--TableView详细解释
  8. Ant Design入门之开始使用
  9. junit - no runnable methods
  10. 硬货 | 一片小小的薄膜,却可以粘住全世界!
  11. python删除、替换字符串某字符后的字符串(删除字符串、替换字符串、strip、split、rstrip、lstrip、replace)
  12. 循环链表设计与API实现
  13. 教程-Delphi资源文件(全面分析于使用)
  14. [论文笔记]FusionNet: Fusing via Fully-Aware Attention with Application to Machine Comprehension
  15. [原创] 数据库小工具 (BatchESQL.exe)
  16. 简单学生成绩管理系统Java版(GUI+Microsoft Access数据库)
  17. pythonista安卓_Android平台有哪些软件类似于iOS上的JSbox、Pythonista和Thor?
  18. 全球及中国工业互联网产业运行态势与布局状况调研报告2022-2028年
  19. 【ffmpeg】支持vp8/vp9编码
  20. Codeigniter 升级

热门文章

  1. 191.基于Django框架发送邮件与手机验证码详解
  2. u盘无媒体容量0无卷还能修吗_膨胀了,我花500块组装了一块比硬盘还快的U盘
  3. HTB_Explosion 靶机之 RDP 协议简介与数字证书分析
  4. React官方文档: 不使用ES6
  5. 沉痛悼念恩师程开甲院士“改革子先锋”(修改稿)
  6. Jquery电话号码的验证
  7. 律师点评——员工因“对公司的赞美不合格”被淘汰
  8. 框选肺结节位置cv2.rectangle()
  9. WinRAR曝遗留19年重大漏洞,可完全控制电脑(附解决方法)
  10. 登录功能,发现账号密码没有区分大小写???