Activiti - 設置會籤

前些天在羣裏聊工做流和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實現這個效果’,由於咱們有:

 

因此我徹底沒有必要本身去定義一個變量去記錄執行了多少次

相關文章
相關標籤/搜索