Activiti原理分析(二)多实例,会或签与依次审批

简介: Activiti 原理分析系列文章的第二篇。这里我们重点研究在 Activity 中如何实现会或签以及依次审批的功能,以及 BPMN 中的多实例规范。

多实例实现会或签,依次审批

如果你去找 Activiti 的会或签解决方案,肯定会发现 Activiti 的多实例功能。

多实例就是一个节点在运行时产生多个实例,这些节点的配置大体上都是相似的,只有参数上可能有所不同,这些实例可以配置成串行执行或者并行执行。比如 UserTask 产生多个实例,每个实例只有负责人不同,会或签就是用这个实现的。

最简单的一个会签配置如下:


<!--会签配置--><userTaskid="someTask"name="Activiti is awesome!"activiti:assignee="${user}"><multiInstanceLoopCharacteristicsisSequential="false"activiti:collection="${userList}"activiti:elementVariable="user"/></userTask>


上面的配置用伪代码表示如下:


# userList 是列表类型的流程变量foruserinuserList:
user作为任务负责人(assignee)执行UserTask


默认情况下只有当所有的实例都完成时,这个 UserTask 才会完成。所以上面这个配置其实就是会签,所有负责人同时进行任务,等到所有任务都完成时,才能结束这个 UserTask。

需要注意的是,因为 isSequential="false",所以这些实例都是并行执行的,也就是这些实例都是同时产生的。如果设置为 true,这些实例则会“依次”执行,也就是第一个负责人完成任务后,第二个实例才会产生,这样依次下去,所以只要将 isSequential 设置为 true 就可以实现依次审批了:


<!--依次审批配置--><userTaskid="someTask"name="Activiti is awesome!"activiti:assignee="${user}"><multiInstanceLoopCharacteristicsisSequential="true"activiti:collection="${userList}"activiti:elementVariable="user"/></userTask>


“或签”又该如何实现呢?multiInstanceLoopCharacteristics 还支持配置结束条件,通过结束条件的配置即可实现或签:


<!--或签配置--><userTaskid="someTask"name="Activiti is awesome!"activiti:assignee="${user}"><multiInstanceLoopCharacteristicsisSequential="false"activiti:collection="${userList}"activiti:elementVariable="user"><completionCondition>${nrOfCompletedInstances == 1}</completionCondition></multiInstanceLoopCharacteristics></userTask>


completionCondition 里面填写的就是结束条件,其中 nrOfCompletedInstances 是多实例节点的内置变量,表示已经完成实例数目,除此之外还有下面几个内置变量:

  • nrOfInstances: 实例总数
  • nrOfCompletedInstances: 已完成实例总数
  • nrOfActiveInstances:当前活跃实例总数

通过这几个变量可以配置出更加丰富的结束条件,比如我可以配置一个 "半会签",即只要一半的人通过就行了:


<!--半会签配置--><userTaskid="someTask"name="Activiti is awesome!"activiti:assignee="${user}"><multiInstanceLoopCharacteristicsisSequential="false"activiti:collection="${userList}"activiti:elementVariable="user"><completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.5}</completionCondition></multiInstanceLoopCharacteristics></userTask>


除了 UserTask 可以多实例,Activiti 上还有好多节点支持多实例,配置也都是相似的:

另外,多实例的这个概念与配置方法都是写在 BPMN 2.0 规范中的,而不是 Acitiviti 独有的,他们在 BPMN 的图形如下(在节点上有三条竖线表示并行,有三条横线表示串行):


image-20201121005318972.png


所以使用这种配置方式,以后想切引擎也是非常方便的。

原理

多实例在代码上采用的是装饰器模式,使用 MultiInstanceActivityBehavior 里面包一个功能节点的 ActivityBehavior,比如 UserTaskActivityBehaviorMultiInstanceActivityBehavior 的两个子类,ParallelMultiInstanceBehaviorSequentialMultiInstanceBehavior 就分别代表并行多实例和串行多实例的逻辑。


image-20201121110818669.png


并行的情况会给每一个实例生成一个 execution,当满足 completionCondition 时,恢复父 execution 的执行,并且删除它的所有子 execution(就是节点产生的多实例):


image-20201121011627711.png


至于串行多实例,这整个一串实例共用一个子 execution:


image-20201121011917925.png


如果原理部分看得比较蒙圈,建议先去看一下我的上一篇文章,然后再来看这里的原理就一目了然了。

参考

相关文章
22activiti - 流程管理定义(查询流程状态)
22activiti - 流程管理定义(查询流程状态)
136 0
activiti创建自子任务,创建抄送任务,任务分裂的实现思路
activiti创建自子任务,创建抄送任务,任务分裂的实现思路
1300 0
|
3月前
|
缓存 前端开发
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
ProFlow 流程编辑器框架问题之创建一个自定义节点如何解决
40 1
|
5月前
|
DataWorks 监控 安全
DataWorks产品使用合集之如何使用节点依赖关系来配置任务之间的执行顺序
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
54 2
|
4月前
|
数据采集 DataWorks 安全
DataWorks产品使用合集之如何通过接口单独触发业务流程里面的某些节点运行
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
DataWorks API 调度
DataWorks产品使用合集之在调度配置配置了节点的上游节点输出,没办法自动生成这个flow的依赖,该怎么操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
前端开发
基于jeecgboot的flowable流程增加节点自动跳过功能
基于jeecgboot的flowable流程增加节点自动跳过功能
401 2
|
6月前
|
移动开发 前端开发
flowable流程跳转或退回到网关上的用户节点后流程走不下去了
flowable流程跳转或退回到网关上的用户节点后流程走不下去了
310 2
|
6月前
|
移动开发 前端开发
基于flowable没有规则的并发网关流程跳转记录分析
基于flowable没有规则的并发网关流程跳转记录分析
115 0
|
6月前
|
JSON 分布式计算 DataWorks
DataWorks常见问题之依赖的自动节点修改为统一调度节点失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。