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());
}
}
數據庫:

執行完成后,整個流程就結束:


