前些天在羣裏聊工做流和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實現這個效果’,由於咱們有:
因此我徹底沒有必要本身去定義一個變量去記錄執行了多少次