1、什么是包含網關
包含網關可以看做是排他網關和並行網關的結合體;和排他網關一樣,你可以在外出順序流上定義條件,包含網關會解析它們;但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣,包含網關的功能是基於進入和外出順序流的;
分支:所有外出順序流的條件都會被解析,結果為true的順序會以並行方式繼續執行,會為每個順序流創建一個分支;
匯聚:所有並行分支達到包含網關,會進入等待狀態,知道每個包含流程token的進入順序流的分支都到達;這是與並行網關的最大不同;換句話說,包含網關只會等待選中執行了的進入順序流;在匯聚之后,流程會穿過包含網關繼續執行;
2、流程定義
3、部署流程
package com.zn; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test; public class ActivitiInclusiveGateway { /** * 流程部署 */ @Test public void deployment() { //獲取ProcessEngine對象 默認配置文件名稱:activiti.cfg.xml 並且configuration的Bean實例ID為processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RepositoryService對象進行流程部署 RepositoryService repositoryService = processEngine.getRepositoryService(); //進行部署,將對應的流程定義文件生成到數據庫當中,作為記錄進行保存 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("bmpnfiles/holidayInclusiveGateway.bpmn") //加載流程文件 .name("請假流程-包含網關") //設置流程名稱 .key("holiday") .deploy(); //部署 //輸出部署信息 System.out.println("流程名稱:" + deployment.getName()); System.out.println("流程ID:" + deployment.getId()); System.out.println("流程Key:" + deployment.getKey()); } }
控制台:
數據庫:
4、啟動流程實例(userType=1)
當userType=1執行的時候,會走常規體驗項和抽血化驗以及早餐,如果是userType=1會走全部四項;
package com.zn; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiInclusiveGateway { /** * 啟動流程實例 */ @Test public void startInstance() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //設置流程變量 Map<String, Object> assMap = new HashMap<>(); assMap.put("userType", 1); //啟動流程實例 ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidayInc", assMap); System.out.println("流程實例:" + holidayGroup.getId()); } }
數據庫:
5、任務處理
package com.zn; import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiInclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("zhangsan").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
在走到包含網關時,需要判斷條件,符合條件的分支,將會執行,最終進行匯聚;
6、任務處理
package com.zn; import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiInclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("lisi").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
7、任務處理
package com.zn; import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiInclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("wangwu").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
8、任務處理
package com.zn; import org.activiti.engine.*; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import java.util.HashMap; import java.util.Map; public class ActivitiInclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayInc").taskAssignee("sunqi").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
執行完成后,整個流程就結束: