1. 程式人生 > 實用技巧 >Activiti7 閘道器(排他閘道器)

Activiti7 閘道器(排他閘道器)

什麼是排他閘道器?

排他閘道器(也叫異或(XOR)閘道器,或叫基於資料的排他閘道器),用於在流程中實現決策,當流程執行到這個閘道器,所有分支都會判斷條件是否為true,如果為true則執行該分支

注意:排他閘道器只會選擇一個為true的分支執行.(即使有兩個分支條件都為true,排他閘道器也會只選擇一條分支去執行)

為什麼要用排他閘道器?

不用排他閘道器也能實現分支

在連線的condition條件上設定分支條件

缺點:

如果條件都不滿足,不使用排他閘道器,流程就結束了(異常結束)

如果使用排他閘道器決定分支的走向

如果從網關出去的線所有條件都不滿足則系統丟擲異常

org.activiti.engine.ActivitiException: No outgoing sequence flow of the exclusive gateway 'exclusivegateway1' could be selected for
continuing the process at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:85)

說明:經過排他閘道器必須要有一條且只有一條分支走.

畫圖:

其他的都一樣就是添加了一個排他閘道器

部署->啟動->提交任務

package com.itheima.test;

import com.itheima.activiti.pojo.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.Before; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * 閘道器測試 */ public class ActivitiGatewayTest { ProcessEngine defaultProcessEngine; @Before
public void init() { defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); } /** * 部署流程定義 */ @Test public void deployment(){ RepositoryService repositoryService = defaultProcessEngine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment() .addClasspathResource("pic/gateway/holidayGateway1.bpmn") .addClasspathResource("pic/gateway/holidayGateway1.png") .name("請假流程") .deploy(); System.out.println(deploy); } /** * 啟動流程例項 */ @Test public void startProcessInstance(){ RuntimeService runtimeService = defaultProcessEngine.getRuntimeService(); Map<String,Object> map = new HashMap<>(); Holiday holiday = new Holiday(); holiday.setNum(5F); map.put("holiday",holiday); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", map); System.out.println(processInstance); } /** * 提交任務 */ @Test public void completTask(){ String assignee = "lisi"; Task task = querySingResultByAssignee(assignee); TaskService taskService = defaultProcessEngine.getTaskService(); taskService.complete(task.getId()); } /** * 查詢使用者唯一任務 * @param assignee * @return */ public Task querySingResultByAssignee(String assignee){ TaskService taskService = defaultProcessEngine.getTaskService(); return taskService.createTaskQuery().processDefinitionKey("myProcess_1").taskAssignee(assignee).singleResult(); } }

提交完部門經理審批後因為兩個判斷都成立,於是走ID號小的流程,只會走一個

當多個條件同時成立的時候,會選擇ID最小的一個流程走,當條件都不成立的時候,排他閘道器也沒招,只能報錯

作者:彼岸舞

時間:2020\09\07

內容關於:Activiti工作流

本文來源於網路,只做技術分享,一概不負任何責任