1. 排他網關
排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用來在流程中實現決策。
當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為 true 則執行該分支,
注意,排他網關只會選擇一個為 true 的分支執行。(即使有兩個分支條件都為 true,排他網關也會只選擇一條分支去執行)
1.1 定義流程
1.2 部署流程
/** * 流程部署的方法 */ @Test public void deployment() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //流程部署 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("holiday/holidayOld.bpmn") .name("請假流程-排他網關") .deploy(); System.out.println("流程部署成功:" + deploy.getName()); }
1.3 啟動流程 當前給的流程變量是5 兩個條件都符合
/** * 啟動流程實例,設置流程變量的值 */ @Test public void startInstance() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //設置流程變量 Holiday holiday = new Holiday(); holiday.setNum(5); Map<String, Object> assMap = new HashMap<>(); assMap.put("holiday", holiday); //啟動流程實例 ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidaygetway", assMap); System.out.println("流程實例:" + holidayGroup.getId()); }
1.4 處理任務
/** * 處理任務 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidaygetway").taskAssignee("zhangsan").singleResult(); //處理任務 taskService.complete(task.getId()); }
1.5 處理lisi的任務
/** * 處理任務 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidaygetway").taskAssignee("lisi").singleResult(); //處理任務 taskService.complete(task.getId()); }
1.6 處理完lisi的任務時條件兩者都符合時選擇ID最小的分支
1.7 查看數據庫任務表
2. 並行網關
並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進 入和外出順序流的:
fork 分支:
並行后的所有外出順序流,為每個順序流都創建一個並發分支。
join 匯聚:
所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后, 流程就會通過匯聚網關。
注意,如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。
這時, 網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。 與其他網關的主要區別是,
並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。
2.1 定義流程圖
2.2 部署流程
/** * 流程部署 */ @Test public void deployment(){ //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //流程部署 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("holiday/holidayPar.bpmn") .name("請假流程-並行網關") .deploy(); System.out.println("流程部署成功:" + deploy.getName()); }
2.3 啟動流程
/** * 啟動流程實例 */ @Test public void startInstance() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //設置流程變量 Map<String, Object> assMap = new HashMap<>(); assMap.put("num", 3); //啟動流程實例 ProcessInstance holidayGroup = runtimeService.startProcessInstanceByKey("holidayPar", assMap); System.out.println("流程實例:" + holidayGroup.getId()); }
2.4 執行流程zhangsan
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhangsan").singleResult(); //處理任務 taskService.complete(task.getId()); }
2.5 執行lisi任務因為天數為3所以直接到人事存檔zhaoliu
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("lisi").singleResult(); //處理任務 taskService.complete(task.getId()); }
2.6 執行zhaoliu任務后進入並行網關 會有兩個待執行任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhaoliu").singleResult(); //處理任務 taskService.complete(task.getId()); }
2.7 查看數據庫任務表
2.8 查看數據庫歷史表
2.9 執行sunqi任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("sunqi").singleResult(); //處理任務 taskService.complete(task.getId()); }
2.10 查看數據庫任務表
2.11 查看數據庫歷史表
2.12 執行sunba任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhouba").singleResult(); //處理任務 taskService.complete(task.getId()); }
2.13 查看數據庫任務表
2.14 查看數據庫歷史表 當並行網關的所有任務都執行完畢后才會進入下一個任務
3. 包含網關
包含網關可以看做是排他網關和並行網關的結合體。 和排他網關一樣,你可以在外出順序流上定義條件,
包含網關會解析它們。 但是主要的區別是包含網關可以選擇多於一條順序流,這和並行網關一樣。
包含網關的功能是基於進入和外出順序流的
3.1 流程定義
3.2 部署流程
/** * 流程部署 */ @Test public void deployment(){ //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RepositoryService對象 RepositoryService repositoryService = processEngine.getRepositoryService(); //流程部署 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("medical/medical.bpmn") .name("體檢流程-包含網關") .deploy(); System.out.println("流程部署成功:" + deploy.getName()); }
3.3 啟動流程實例 當前流程變量為1
/** * 啟動流程實例 */ @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("medical", assMap); System.out.println("流程實例:" + holidayGroup.getId()); }
3.4 執行zhangsan任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("zhangsan").singleResult(); //處理任務 taskService.complete(task.getId()); }
3.5 查看數據庫任務表
3.6 執行lisi任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("lisi").singleResult(); //處理任務 taskService.complete(task.getId()); }
3.7 查看數據庫任務表
3.8 執行wangwu任務
/** * 執行流程 */ @Test public void commitTask() { //獲取ProcessEngine對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("medical").taskAssignee("wangwu").singleResult(); //處理任務 taskService.complete(task.getId()); }
3.9 查看數據庫任務表 包含網關任務
3.10 查看數據庫歷史表 都已經執行完畢