Activiti——網關


1.排他網關

排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用來在流程中實現決策。 當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為 true 則執行該分支,

注意,排他網關只會選擇一個為 true 的分支執行。(即使有兩個分支條件都為 true,排他網關也會只選擇一條分支去執行)

  1.1為什么要用排他網關?

    不用排他網關也可以實現分支,如下圖

    

 

 

     

    上圖中,在連線的condition 條件上設置分支條件。

    缺點:

    如果條件都不滿足,不使用排他網關,流程就結束了(是異常結束)。如果 使用排他網關決定分支的走向,如下

    

     

 

 

     

    如果從網關出去的線所有條件都不滿足則系統拋出異常。

    org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for continuing the process

    at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehav ior.leave(ExclusiveGatewayActivityBehavior.java:85)

 

    說明 :經過排他網關必須要有一條且只有一條分支走。

2.並行網關

並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進 入和外出順序流的:

fork 分支:

並行后的所有外出順序流,為每個順序流都創建一個並發分支。

join 匯聚:

所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后,  流程就會通過匯聚網關。

注意,如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時, 網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。

與其他網關的主要區別是,並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略

 

 

 

財務結算和入庫是兩個 execution 分支,在 act_ru_execution 表有兩條記錄分別是財務結算和入庫,act_ru_execution 還有一條記錄表示該流程實例。

待財務結算和入庫任務全部完成,在匯聚點匯聚,通過 parallelGateway 並行網關。並行網關在業務應用中常用於會簽任務,會簽任務即多個參與者共同辦理的任務。

測試:

當執行到並行網關數據庫跟蹤如下:

當前任務表:SELECT * FROM act_ru_task #當前任務表

上圖中:有兩個(多個)任務當前執行。

通過流程實例執行表:SELECT * FROM act_ru_execution #流程實例的執行表

 

上圖中,說明當前流程實例有多個分支(兩個)在運行。

 

對並行任務的執行:

並行任務執行不分前后,由任務的負責人去執行即可。

當完成並行任務中一個任務后:

已完成的任務在當前任務表act_ru_task_已被刪除。

在流程實例執行表:SELECT * FROM act_ru_execution 有中多個分支存在且有並行網關的匯聚結點。

 

 

有並行網關的匯聚結點:說明有一個分支已經到匯聚,等待其它的分支到達。

當所有分支任務都完成,都到達匯聚結點后:

流程實例執行表:SELECT * FROM  act_ru_execution,執行流程實例不存在,說明流程執行結束。總結:所有分支到達匯聚結點,並行網關執行完成。

 

3.包含網關

包含網關可以看做是排他網關和並行網關的結合體。 和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。 但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。

包含網關的功能是基於進入和外出順序流的:

分支:

所有外出順序流的條件都會被解析,結果為 true 的順序流會以並行方式繼續執行, 會為每個順序流創建一個分支。

匯聚:

所有並行分支到達包含網關,會進入等待狀態, 直到每個包含流程 token 的進入順序流的分支都到達。 這是與並行網關的最大不同。換句話說,包含網關只會等待被選中執行了的進入順序流。

在匯聚之后,流程會穿過包含網關繼續執行。

案例:

企業體檢流程,公司全體員工進行常規項檢查、抽血化驗,公司管理層除常規檢查和抽血化驗還要 進行增加項檢查。

 

員工類型:

通過流程變量userType 來表示,如果等於 1 表示普通員工,如果等於 2 表示領導

 

 

 

 

 

注意:通過包含網關的每個分支的連線上設置condition 條件。

 測試:

如果包含網關設置的條件中,流程變量不存在,報錯;

org.activiti.engine.ActivitiException:  Unknown   property   used in  expression: ${userType=='1' || userType=='2'}

需要在流程啟動時設置流程變量userType

當執行到包含網關:

流程實例執行表:SELECT * FROM act_ru_execution

 

第一條記錄:包含網關分支。

后兩條記錄:兩個分支:常規項體檢,抽血化驗當前任務表:ACT_RU_TASK_

 

上圖中,常規項體檢,抽血化驗都是當前的任務,在並行執行。

如果有一個分支執行到匯聚:

 

先走到匯聚結點的分支,要等待其它分支走到匯聚。等所有分支走到匯聚,包含網關就執行完成。

包含網關執行完成,分支和匯聚就從act_ru_execution 刪除。

 

 

小結:在分支時,需要判斷條件,符合條件的分支,將會執行,符合條件的分支最終才進行匯聚。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM