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 刪除。
小結:在分支時,需要判斷條件,符合條件的分支,將會執行,符合條件的分支最終才進行匯聚。