当前位置: 代码迷 >> 综合 >> Activiti 工作流引擎 ~ 多实例任务
  详细解决方案

Activiti 工作流引擎 ~ 多实例任务

热度:16   发布时间:2023-12-08 17:36:57.0

本文使用的Activiti版本为5.22.0

每个实例有这几个变量
nrOfInstantces:实例的总数量
nrOfActiveInstances:当前活动的数量,未完成的实例,对于串行,这个参数的值始终是1
nrOfCompletedInstances:已经完成的实例数量

<multiInstanceLoopCharacteristics isSequential="false|true">...
</multiInstanceLoopCharacteristics>

isSequential属性指定这个任务的实例是并行执行还是串行之行

当进入多实例任务时,会一次性计算实例的数量。这里有一些配制实例数量的方式。
一种是利用loopCardinality子元素直接指定一个数量

<multiInstanceLoopCharacteristics isSequential="false|true"><loopCardinality>5</loopCardinality>
</multiInstanceLoopCharacteristics>

另一种是利用loopDataInputRef子元素指定一个集合的流程参数名,然后利用inputDataItem子元素指定集合中的项目

<userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="false"><loopDataInputRef>assigneeList</loopDataInputRef><inputDataItem name="assignee" /></multiInstanceLoopCharacteristics>
</userTask>

假定assigneeList变量的值为\[kermit, gonzo, fozzie\],在上面的片段中,将创建三个并行用户任务。有一个名为assignee的流程变量值为集合中的一个元素-用于分配用户任务

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="true"activiti:collection="${myService.resolveUsersForTask()}" activiti:elementVariable="assignee" ></multiInstanceLoopCharacteristics>
</userTask>

当多实例任务中的每个实例都完成时这个多实例也就结束了。在每个实例结束的时候都会对指定的表达式求值。当这个表达式的值为true时,所有剩余的实例被结束并且这个任务也被结束掉,继续执行流程。表达式被定义在completionCondition子元素。

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="false"activiti:collection="assigneeList" activiti:elementVariable="assignee" ><completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition></multiInstanceLoopCharacteristics>
</userTask>

在这个例子中,assigneeList中的每个元素将创建并行实例。当已完成的任务达到60%时,其它的任务被删掉,流程继续向下执行

界面与xml元素的对应关系
这里写图片描述

这里写图片描述

  相关解决方案