排他網關
1、什么是排他網關
排他網關(也叫異或(XOR)網關,或叫基於數據的排他網關),用來在流程中實現決策。 當流程執行到這個網關,所有分支都會判斷條件是否為true,如果為 true 則執行該分支,
注意,排他網關只會選擇一個為 true 的分支執行。(即使有兩個分支條件都為 true,排他網關也會只選擇一條分支去執行)
不使用排他網關也可以實現分支:
上圖中,在連線的condition條件上設置分支條件;
缺點:如果條件都不滿足,不使用排他網關,流程就結束了(是異常結束);
如果使用排他網關決定分支的走向:
如果從網關出去的線所有條件都不滿足則系統拋出org.activiti.engine.ActivitiException異常;
說明:經過排他網關必須要有一條且只有一條分支走;
2、流程定義
3、部署流程
package com.zn; import com.zn.entity.Holiday; 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 ActivitiExclusiveGateway { /** * 流程部署 */ @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/holidayExclusiveGateway.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 com.zn.entity.Holiday; 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 ActivitiExclusiveGateway { /** * 啟動流程實例 */ @Test public void getInstance() { //獲取ProcessEngine對象 默認配置文件名稱:activiti.cfg.xml 並且configuration的Bean實例ID為processEngineConfiguration ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); //設置流程變量 啟動流程時設置 Holiday holiday=new Holiday(); holiday.setNum(3); //定義一個map集合,存放assignee的值 Map<String ,Object> assMap=new HashMap<>(); assMap.put("holiday",holiday); //啟動一個流程實例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayWay", assMap); System.out.println("流程啟動成功~"); } }
數據庫:
5、任務處理
package com.zn; import com.zn.entity.Holiday; 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 ActivitiExclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayWay").taskAssignee("zhangsan").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫:
6、任務處理
package com.zn; import com.zn.entity.Holiday; 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 ActivitiExclusiveGateway { /* *任務處理 */ @Test public void completeTask(){ //獲取ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //獲取TaskService對象 TaskService taskService = processEngine.getTaskService(); //查詢到自己的任務,然后通過任務ID進行提交 Task task = taskService.createTaskQuery().processDefinitionKey("holidayWay").taskAssignee("lisi").singleResult(); //任務處理 taskService.complete(task.getId()); } }
數據庫: