本文使用的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元素的对应关系