什么是排他网关?
排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用于在流程中实现决策,当流程执行到这个网关,所有分支都会判断条件是否为true,如果为true则执行该分支
注意:排他网关只会选择一个为true的分支执行.(即使有两个分支条件都为true,排他网关也会只选择一条分支去执行)
为什么要用排他网关?
不用排他网关也能实现分支
![](https://i-blog.csdnimg.cn/blog_migrate/f15f5b27e587049e019dbd43dc245266.png)
在连线的condition条件上设置分支条件
缺点:
如果条件都不满足,不使用排他网关,流程就结束了(异常结束)
如果使用排他网关决定分支的走向
![](https://i-blog.csdnimg.cn/blog_migrate/c8f1f748467cddbf2d120f22eb1eec1f.png)
如果从网关出去的线所有条件都不满足则系统抛出异常
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)
说明:经过排他网关必须要有一条且只有一条分支走.
画图:
其他的都一样就是添加了一个排他网关
![](https://i-blog.csdnimg.cn/blog_migrate/23ced68c2ac5e523d9f7c9f06685fc99.png)
部署->启动->提交任务
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工作流
本文来源于网络,只做技术分享,一概不负任何责任