天天看點

Activiti學習之 多執行個體實作會簽功能

一個任務需要多個角色進行審批或者表決,根據這些審批結果來決定流程的走向。實作以上任務,activiti已經提供了支援,可以使用BPMN規範的多執行個體活動來實作。

1.Activiti多執行個體:

多執行個體節點是在業務流程中定義重複環節的一個方法。 從開發角度講,多執行個體和循環是一樣的: 它可以根據給定的集合,為每個元素執行一個環節甚至一個完整的子流程, 既可以順序依次執行也可以并發同步執行。

多執行個體是在一個普通的節點上添加了額外的屬性定義 (是以叫做'多執行個體特性'),這樣運作時節點就會執行多次。 下面的節點都可以成為一個多執行個體節點:

  • User Task
  • Script Task
  • Java Service Task
  • Web Service Task
  • Business Rule Task
  • Email Task
  • Manual Task
  • Receive Task
  • (Embedded) Sub-Process
  • Call Activity

根據規範的要求,每個上級流程為每個執行個體建立分支時都要提供如下變量:

  • nrOfInstances:執行個體總數
  • nrOfActiveInstances:目前活動的,比如,還沒完成的,執行個體數量。 對于順序執行的多執行個體,值一直為1。
  • nrOfCompletedInstances:已經完成執行個體的數目。

可以通過

execution.getVariable(x)

方法獲得這些變量。

另外,每個建立的分支都會有分支級别的本地變量(比如,其他執行個體不可見, 不會儲存到流程執行個體級别):

  • loopCounter:表示特定執行個體的在循環的索引值。可以使用activiti的elementIndexVariable屬性修改loopCounter的變量名。

圖形标記

如果節點是多執行個體的,會在節點底部顯示三條短線。 三條豎線表示執行個體會并行執行。 三條橫線表示順序執行。

Activiti學習之 多執行個體實作會簽功能

Xml内容

要把一個節點設定為多執行個體,節點xml元素必須設定一個

multiInstanceLoopCharacteristics

子元素。

<multiInstanceLoopCharacteristics isSequential="false|true">
 ...
</multiInstanceLoopCharacteristics>      

isSequential屬性表示節點是進行 順序執行還是并行執行。

執行個體的數量會在進入節點時計算一次。 有一些方法配置它。一種方法是使用loopCardinality子元素直接指定一個數字。

<multiInstanceLoopCharacteristics isSequential="false|true">
  <loopCardinality>5</loopCardinality>
</multiInstanceLoopCharacteristics>      

也可以使用結果為整數的表達式:

<multiInstanceLoopCharacteristics isSequential="false|true">
  <loopCardinality>${nrOfOrders-nrOfCancellations}</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, foziee]

。 在上面代碼中,三個使用者任務會同時建立。每個分支都會擁有一個用名為

assignee

的流程變量, 這個變量會包含集合中的對應元素,在例子中會用來設定使用者任務的配置設定者。

loopDataInputRef

inputDataItem

的缺點是1)名字不好記, 2)根據BPMN 2.0格式定義,它們不能包含表達式。activiti通過在 

multiInstanceCharacteristics

中設定 collection和 elementVariable屬性解決了這個問題:

<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%的任務完成時,其他任務就會删除,流程繼續執行。

以上内容為Activiti使用者手冊的内容,下面實作一個簡單地流程 2.流程實作 流程圖為:

Activiti學習之 多執行個體實作會簽功能

properties:

Activiti學習之 多執行個體實作會簽功能

XML: <userTask id="usertask1" name="會簽" activiti:assignee="${assignee}">

      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${assigneeList}" activiti:elementVariable="assignee">

        <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>

      </multiInstanceLoopCharacteristics>

</userTask>

釋出流程: Deployment deployment = repositoryService.createDeployment()

 .addClasspathResource("com/chq/ssh/test/activiti/deploy/huiqian.bpmn20.xml")

 .deploy();

啟動流程: List<String> assigneeList=new ArrayList<String>(); //配置設定任務的人員

assigneeList.add("tom");

assigneeList.add("jeck");

assigneeList.add("mary");

Map<String, Object> vars = new HashMap<String, Object>(); //參數

vars.put("assigneeList", assigneeList);

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("huiqian",vars);

查詢任務: 這時查詢以上三個人的任務,都會顯示有“會簽”這個任務 List<Task> tasks = taskService.createTaskQuery().taskAssignee("mary").list();

完成任務: 會簽節點設定的: ${nrOfCompletedInstances/nrOfInstances >= 0.6 } 所有任務完成超過60%,剩餘的任務就會删除,表示會簽通過。 上面一共設定了三個任務,當兩個完成時,超過60%。流程結束

繼續閱讀