Activiti工作流之网关
1.排他網關
排他網關(也叫異或(XOR)網關,或叫基于數據的排他網關),用來在流程中實現決策。 當流程執行到這個網關,所有分支都會判斷條件是否為 true,如果為 true 則執行該分支。
注意,排他網關只會選擇一個為 true 的分支執行。(即使有兩個分支條件都為 true,排他網關也會只選擇一條分支去執行)
?
如果從網關出去的線所有條件都不滿足則系統拋出異常
?
說明:
-
經過排他網關必須要有一條且只有一條分支走
-
當排他網關中有多個條件同時滿足,則走id最小的那個條件
2.并行網關
并行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,并行網關的功能是基于進入和外出順序流的:
-
fork分支:
并行后的所有外出順序流,為每個順序流都創建一個并發分支。
-
join匯聚:
所有到達并行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后,流程就會通過匯聚網關。
注意,如果同一個并行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時, 網關會先匯聚所有進入的順序流,然后再切分成多個并行分支。
與其他網關的主要區別是,并行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。
?
財務會計和行政考勤是兩個并行分支
在 act_ru_execution 表有兩條記錄分別是財務結算和入庫,act_ru_execution 還有一條記錄表示該流程實例。
待財務結算和入庫任務全部完成,在匯聚點匯聚,通過 parallelGateway 并行網關。并行網關在業務應用中常用于會簽任務,會簽任務即多個參與者共同辦理的任務。
3.包含網關
包含網關可以看做是排他網關和并行網關的結合體。 和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們。 但是主要的區別是包含網關可以選擇多于一條順序流,這和并行網關一樣。包含網關的功能是基于進入和外出順序流的:
-
分支:
所有外出順序流的條件都會被解析,結果為 true 的順序流會以并行方式繼續執行, 會為每個順序流創建一個分支。
-
匯聚:
所有并行分支到達包含網關,會進入等待狀態, 直到每個包含流程 token 的進入順序流的分支都到達。 這是與并行網關的最大不同。換句話說,包含網關只會等待被選中執行了的進入順序流。 在匯聚之后,流程會穿過包含網關繼續執行。
(1)流程定義
企業體檢流程,公司全體員工進行常規項檢查、抽血化驗,公司管理層除常規檢查和抽血化驗還要 進行增加項檢查。
員工類型:
通過流程變量 userType 來表示,如果等于 1 表示普通員工,如果等于 2 表示領導
?
(2)部署流程
? ?public static void main(String[] args) {//1.創建ProcessEngine對象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到RepositoryService實例RepositoryService repositoryService = processEngine.getRepositoryService(); ?//3.進行部署Deployment deployment = repositoryService.createDeployment().addClasspathResource("diagram/examine.bpmn") ?//添加bpmn資源.name("體檢流程").deploy(); ?//4.輸出部署的一些信息System.out.println(deployment.getName());System.out.println(deployment.getId());}(3)啟動流程實例
? ?public static void main(String[] args) {//1.得到ProcessEngine對象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到RunService對象RuntimeService runtimeService = processEngine.getRuntimeService(); ?Integer userType = 2;//代表管理者Map<String, Object> map = new HashMap<>();map.put("userType", userType);//流程變量賦值 ?//3.創建流程實例 流程定義的key需要知道 holidayProcessInstance processInstance = runtimeService.startProcessInstanceByKey("examine", map); ? ?//4.輸出實例的相關信息System.out.println("流程定義ID" + processInstance.getProcessDefinitionId());//holiday:1:4System.out.println("流程實例ID" + processInstance.getId());//2501}(4)依次執行
? ?public static void main(String[] args) {//1.得到ProcessEngine對象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到TaskService對象TaskService taskService = processEngine.getTaskService(); ?//3.查詢當前用戶的任務Task task = taskService.createTaskQuery().processDefinitionKey("examine").taskAssignee("xiaoqi").singleResult(); ?//4.處理任務,結合當前用戶任務列表的查詢操作的話,任務ID:task.getId()if (task != null) {taskService.complete(task.getId());System.out.println("用戶任務執行完畢...");//5.輸出任務的idSystem.out.println(task.getId());}}注意:在分支時,需要判斷條件,符合條件的分支,將會執行,符合條件的分支最終才進行匯聚。
當執行到包含網關:
SELECT * FROM act_ru_task
?
上圖中,常規項體檢,抽血化驗,附加項體檢都是當前的任務,在并行執行。
等三個分支全部執行完畢后,分支和匯聚就從 act_ru_execution 刪除。
流程執行完畢,可以查詢一下之前的執行記錄。
SELECT * FROM act_hi_actinct
?
總結
以上是生活随笔為你收集整理的Activiti工作流之网关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Activiti工作流之流程变量
- 下一篇: Activiti与Spring的整合