1、什么是並行網關
並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進 入和外出順序流的:
fork 分支:
並行后的所有外出順序流,為每個順序流都創建一個並發分支。
join 匯聚:
所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以后, 流程就會通過匯聚網關。
注意:
如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時, 網關會先匯聚所有進入的順序流,然后再切分成多個並行分支。
與其他網關的主要區別:
並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。
2、流程定義
3、部署流程
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 ActivitiParallelGateway { /** * 流程部署 */ @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/holidayParallelGateway .bpmn") //加載流程文件 .name("請假流程-並行網關") //設置流程名稱 .key("holiday") .deploy(); //部署 //輸出部署信息 System.out.println("流程名稱:" + deployment.getName()); System.out.println("流程ID:" + deployment.getId()); System.out.println("流程Key:" + deployment.getKey()); } }
控制台:
數據庫:
4、啟動流程實例
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 ActivitiParallelGateway { /** * 啟動流程實例 */ @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()); } }
數據庫:
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 ActivitiParallelGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").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 ActivitiParallelGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").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 ActivitiParallelGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhaoliu").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 ActivitiParallelGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("sunqi").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
9、任務處理
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 ActivitiParallelGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayPar").taskAssignee("zhouba").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
執行完成后,整個流程就結束: