前些天在群里聊工做流和Activiti,群里有人分享了本身的工做流引擎开源项目,大伙纷纷问这问那(好比为何忽然本身搞个process engine、有没有eclipse plugin、能不能绘制流程图等等)。java
现实生活中的工做流程,咱们也常常碰到须要会签的状况,支持会签是很必要的。
正好有两我的问道:支持会签吗? 也有人也问道:什么是会签?数据库
若是从process engine的角度上讲呢?
能够说一个task节点下有多个task instance。
而不是一个从task节点执行到多个task节点(这样就是ParallelGateway了)。 eclipse
如何让一个Task节点建立出多个instance?官网是这样说的:oop
To make an activity multi-instance, the activity xml element must have a multiInstanceLoopCharacteristics child element. code
既然是建立多个实例,咱们就须要用一个集合去存放。
咱们能够在multiInstanceLoopCharacteristics
标签中加入一个attribute —— activiti:collection=""。
该attribute的值是当前流程实例的变量名,也就是启动该引擎实例时传入的Map的key。
而这个Map的value必须是java.util.List
类型的。但咱们无需在乎这个List的泛型是什么。
假如泛型是String的话,act_ru_variable
中变量的TYPE_
字段值是string。
也许我可让泛型是Map,那么该变量的TYPE_字段值是serialize,仅此而已。
本文中activiti:collection="assigneeList"
xml
咱们在数据库里记录了这个集合,但咱们也须要记录这个记录中的每个元素。
记录每个元素时他们的名字应该是什么?
咱们能够用activiti:elementVariable=""
好比我设置:blog
activiti:elementVariable="assignee"
假设咱们如今要的效果是:有三我的能够会签,但只要两我的签署即可经过。
咱们须要设置特定的条件来结束当前这个task。
这时咱们须要在multiInstanceLoopCharacteristics下增长一个子节点——completionCondition
。
好比我是这样设置的:ip
<completionCondition> ${signCount >= 2 } </completionCondition>
好了,这样就是整个Task的定义了。(事实上我彻底能够不用signCount实现这个效果。)element
<userTask id="counterTask_1" name="COUNTERTASK"> <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee"> <completionCondition>${signCount >= 2 }</completionCondition> </multiInstanceLoopCharacteristics> </userTask>
部署后的结果以下: 部署
此处省略部署流程的操做,咱们来看一下如何申请该流程。
以下我在页面中定义了三个审核人员:
<label> <input type="checkbox" name="assigneeList" value="kim"/>kim </label> <label> <input type="checkbox" name="assigneeList" value="jin"/>jin </label> <label> <input type="checkbox" name="assigneeList" value="king"/>king </label>
而后在java中接收并start:
private String[] assigneeList; Map<String, Object> processInstVar = new HashMap<String, Object>(); //必须是List processInstVar.put("assigneeList", Arrays.asList(assigneeList)); processInstVar.put("signCount", 0); runtimeService.startProcessInstanceById(processId, processInstVar);
启动结果以下:
而后是执行,method只接收一个taskId:
List<Task> taskResultList = taskService.createTaskQuery().taskId(taskId) .list(); //当前executionId String currentExecutionId = taskResultList.get(0).getExecutionId(); //当前签署总数 String currentSignCount = StringUtils.defaultString(runtimeService .getVariable(currentExecutionId, "signCount").toString(), "0"); //签署数+1 runtimeService.setVariable(currentExecutionId, "signCount", Integer.parseInt(currentSignCount) + 1); //完成 taskService.complete(taskId);
咱们执行了刚才建立的三个实例之一,结果是:
再执行一次,会签节点的实例已经不存在于actrutask表了,由于我设置的是“有两我的签署便经过”。
以下图,当前task已经不是会签的task了,相关的变量也消失不见了。
最后说我以前为何说道‘事实上我彻底能够不用signCount实现这个效果’,由于咱们有:
因此我彻底没有必要本身去定义一个变量去记录执行了多少次