I.顺序流
条件顺序流 -- 在顺序流里面可以定义表达式,表达式的计算结果是true,顺序流就往这里走了,一般这些顺序流的源对象是网关或流程活动
默认顺序流 -- 就是条件顺序流 里有一条 不配置 如下的标签<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days <= 3}
]]></conditionExpression>
那么如果其他条件顺序流都不满足,就会走默认顺序流
II.网关
单向网关 :只会选一条路走,注意选那条路走不要加错逻辑即可
并行网关 :几条路同时走
兼容网关 :单向网关和并行网关的结合体
事件网关 :只会选择最先触发的那条路走
组合网关
一、测试 单向网关+条件顺序流 ,在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days <= 3}
]]></conditionExpression>
在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days > 5}
]]></conditionExpression>
其中${days > 5} 是JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入
1.1 按上图新建一个流程图 one-way-gateway.bpmn
1.2 修改 one-way-gateway.bpmn targetRef="usertask2-部门经理审批", targetRef="usertask3-总经理审批" 这两条sequenceFlow 命名为小于等于5天、大于5天这条顺序流 并分别
在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days <= 3}
]]></conditionExpression>
在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days > 5}
]]></conditionExpression>
其中${days > 5} 是JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入
1.3 测试代码
/**
* 测试 单向网关+条件顺序流 ,在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days <= 3}
]]></conditionExpression>
在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days > 5}
]]></conditionExpression>
其中${days > 5} 是JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入
*/
public static void testOneWayGateway(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("one-way-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 ,one-way-gateway.bpmn 中有用到JUEL表达式 days,所以,需要 byKey带map启动
Map<String,Object> vars=new HashMap<String,Object>();
vars.put("days", 3);
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
// 完成第一个任务
taskService.complete(task.getId());
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:当前任务:填写请假申请
当前任务:部门经理审批
* */
}
二、事件网关 :只会选择最先触发的那条路走
2.1 参照上图 新建event-gateway.bpmn
2.2 修改 event-gateway.bpmn ,加信号和定时
2.3测试代码
//事件网关 :只会选择最先触发的那条路走--即高级工程师那条流程
public static void testEventGateway1(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 --走带 发信号那条流程--即,因为定时器流程要5秒后才触发,所以肯定比这个慢
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
runService.signalEventReceived("事件网关-发信号");// event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:
* 当前任务:高级工程师
* */
}
//事件网关 :只会选择最先触发的那条路走--初级工程师那条流程
public static void testEventGateway2(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 --不走带 发信号那条流程--定时器流程要5秒后才触发,
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//runService.signalEventReceived("事件网关-发信号"); 不发信号event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>
try {
Thread.sleep(8*1000);//睡8秒,好让初级工程师那条路定时器触发
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:
* 当前任务:初级工程师
* */
}
总测试JAVA GatewayTest.java
package com.xiangshuai.act.c23;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
/**
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤20- BPMN其他元素(2)顺序流与网关
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤20- BPMN其他元素(2)顺序流与网关
*
*/
public class GatewayTest {
public static void main(String[] args) {
//testOneWayGateway();
//testEventGateway11();
testEventGateway2();
}
/**
* 测试 单向网关+条件顺序流 ,在targetRef="部门经理审批"的这条顺序流---即小于等于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days <= 3}
]]></conditionExpression>
在targetRef="总经理审批"的这条顺序流---即大于5天这条顺序流 < sequenceFlow>标签内上加 条件
<conditionExpression xsi:type="tFormalExpression"><![CDATA[
${days > 5}
]]></conditionExpression>
其中${days > 5} 是JUEL表达式,需在JAVA代码流程启动时ByKey map参数注入
*/
public static void testOneWayGateway(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("one-way-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 ,one-way-gateway.bpmn 中有用到JUEL表达式 days,所以,需要 byKey带map启动
Map<String,Object> vars=new HashMap<String,Object>();
vars.put("days", 3);
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
// 完成第一个任务
taskService.complete(task.getId());
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:当前任务:填写请假申请
当前任务:部门经理审批
* */
}
//事件网关 :只会选择最先触发的那条路走--即高级工程师那条流程
public static void testEventGateway1(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 --走带 发信号那条流程--即,因为定时器流程要5秒后才触发,所以肯定比这个慢
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
runService.signalEventReceived("事件网关-发信号");// event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:
* 当前任务:高级工程师
* */
}
//事件网关 :只会选择最先触发的那条路走--初级工程师那条流程
public static void testEventGateway2(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("event-gateway.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程 --不走带 发信号那条流程--定时器流程要5秒后才触发,
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
//runService.signalEventReceived("事件网关-发信号"); 不发信号event-gateway.bpmn <signal id="mySignal" name="事件网关-发信号"></signal>
try {
Thread.sleep(8*1000);//睡8秒,好让初级工程师那条路定时器触发
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务:" + task.getName());
/*
* 输出结果:
* 当前任务:初级工程师
* */
}
}