⼀个任务需要多个⾓⾊进⾏审批或者表决,根据这些审批结果来决定流程的⾛向。实现以上任务,activiti已经提供了⽀持,可以使⽤BPMN规范的多实例活动来实现。
1.Activiti多实例:
多实例节点是在业务流程中定义重复环节的⼀个⽅法。 从开发⾓度讲,多实例和循环是⼀样的: 它可以根据给定的集合,为每个元素执⾏⼀个环节甚⾄⼀个完整的⼦流程, 既可以顺序依次执⾏也可以并发同步执⾏。
多实例是在⼀个普通的节点上添加了额外的属性定义 (所以叫做'多实例特性'),这样运⾏时节点就会执⾏多次。 下⾯的节点都可以成为⼀个多实例节点:User TaskScript TaskJava Service TaskWeb Service TaskBusiness Rule TaskEmail TaskManual TaskReceive Task
(Embedded) Sub-ProcessCall Activity
根据规范的要求,每个上级流程为每个实例创建分⽀时都要提供如下变量:nrOfInstances:实例总数
nrOfActiveInstances:当前活动的,⽐如,还没完成的,实例数量。 对于顺序执⾏的多实例,值⼀直为1。nrOfCompletedInstances:已经完成实例的数⽬。可以通过execution.getVariable(x)⽅法获得这些变量。
另外,每个创建的分⽀都会有分⽀级别的本地变量(⽐如,其他实例不可见, 不会保存到流程实例级别):
loopCounter:表⽰特定实例的在循环的索引值。可以使⽤activiti的elementIndexVariable属性修改loopCounter的变量名。图形标记
如果节点是多实例的,会在节点底部显⽰三条短线。 三条竖线表⽰实例会并⾏执⾏。 三条横线表⽰顺序执⾏。
Xml内容
要把⼀个节点设置为多实例,节点xml元素必须设置⼀个multiInstanceLoopCharacteristics⼦元素。
isSequential属性表⽰节点是进⾏ 顺序执⾏还是并⾏执⾏。
实例的数量会在进⼊节点时计算⼀次。 有⼀些⽅法配置它。⼀种⽅法是使⽤loopCardinality⼦元素直接指定⼀个数字。
另⼀个定义实例数⽬的⽅法是,通过loopDataInputRef⼦元素,设置⼀个类型为集合的流程变量名。 对于集合中的每个元素,都会创建⼀个实例。 也可以通过inputDataItem⼦元素指定集合。 下⾯的代码演⽰了这些配置:
假设assigneeList变量包含这些值[kermit, gonzo, foziee]。 在上⾯代码中,三个⽤户任务会同时创建。每个分⽀都会拥有⼀个⽤名为assignee的流程变量, 这个变量会包含集合中的对应元素,在例⼦中会⽤来设置⽤户任务的分配者。
loopDataInputRef和inputDataItem的缺点是1)名字不好记, 2)根据BPMN 2.0格式定义,它们不能包含表达式。activiti通过在 multiInstanceCharacteristics中设置 collection和 elementVariable属性解决了这个问题:
多实例节点在所有实例都完成时才会结束。也可以指定⼀个表达式在每个实例结束时执⾏。 如果表达式返回true,所有其他的实例都会销毁,多实例节点也会结束,流程会继续执⾏。 这个表达式必须定义在completionCondition⼦元素中。
在这⾥例⼦中,会为assigneeList集合的每个元素创建⼀个并⾏的实例。 当60%的任务完成时,其他任务就会删除,流程继续执⾏。以上内容为Activiti⽤户⼿册的内容,下⾯实现⼀个简单地流程2.流程实现流程图为:properties:
XML:
发布流程:
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource(\"com/chq/ssh/test/activiti/deploy/huiqian.bpmn20.xml\") .deploy();启动流程:
List Map ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(\"huiqian\ 因篇幅问题不能全部显示,请点此查看更多更全内容