当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分支。排他网关只会选择一个为 true 的分支执行。(即使有两个分支条件都为 true,排他网关也会只选择一条分支去执行)
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd">
<process id="exclusiveTask" name="排他网关">
<startEvent id="leave" name="排他网关"/>
<sequenceFlow sourceRef="leave" targetRef="exclusiveGateway1"/>
<exclusiveGateway id="exclusiveGateway1" name="Exclusive Gateway"/>
<userTask id="userTask1" name="精英"/>
<userTask id="userTask2" name="优秀"/>
<userTask id="userTask3" name="普通"/>
<sequenceFlow id="flow2" sourceRef="exclusiveGateway1" targetRef="userTask1">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${score >= 90}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" sourceRef="exclusiveGateway1" targetRef="userTask2">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${score >= 75 && score < 90}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="exclusiveGateway1" targetRef="userTask3">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${score < 75}]]>
</conditionExpression>
</sequenceFlow>
<!-- 默认数据流 -->
<sequenceFlow id="flow5" sourceRef="exclusiveGateway1" targetRef="userTask1"/>
<sequenceFlow id="flow6" sourceRef="userTask1" targetRef="processEnd"/>
<sequenceFlow id="flow7" sourceRef="userTask2" targetRef="processEnd"/>
<sequenceFlow id="flow8" sourceRef="userTask3" targetRef="processEnd"/>
<endEvent id="processEnd" />
</process>
</definitions>
代码:
package com.lala.gateway;
import common.ProcessEngineUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class Exclusive {
public static void main(String[] args) {
ProcessEngineUtil processEngineUtil = new ProcessEngineUtil("exclusibe.bpmn20.xml");
ProcessEngine processEngine = processEngineUtil.getProcessEngine();
Map<String, Object> variables = new HashMap<>();
variables.put("key1", "3");
variables.put("score", "74");
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey("exclusiveTask", variables);
List<Task> tasks = processEngine.getTaskService().createTaskQuery().list();
for (Task task : tasks) {
System.out.println("task.name = {}" + task.getName());
processEngine.getTaskService().complete(task.getId());
}
processEngineUtil.draw(processInstance);
}
}
流程图: