边界事件(是捕获事件)
- 定时器边界事件
- 错误边界事件
- 信号边界事件
- 补偿边界事件
边界事件被触发,那么当前流程会被终止,改走触发后的流程
本章节需掌握前三种
事件的学习掌握两点:什么时候会被触发,触发后有什么后果
一、定时器边界事件
测试当正常流程节点初级工程师如果1分钟没有搞定(即定时器延时执行标签-- <timeDuration>PT1M</timeDuration>
一分钟后会执行定时器边界事件),就触发定时器边界事件让中级工程师节点进行处理
1.1 新建 timer- boundary-event-test.bpmn
1.2 修改 timer- boundary-event-test.bpmn
设置初级工程师 触发定时器边界事件 设为1分钟
1.3 修改 activiti.cfg.xml 因为定时器事件需异步
3.5 测试代码
//测试 定时器边界事件
public static void timerBoundaryEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer- boundary-event-test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
//线程睡眠70秒,这样 在第60秒的时候,就会触发初级工程师的 定时器边界事件(<timeDuration>PT1M</timeDuration>),跳到中级工程师处理节点
try {
Thread.sleep(70*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
/*
输出 当前任务是 初级工程师
当前任务是 中级工程师*/
}
二、错误边界事件
参考:E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤12- 16 BPMN事件(3)结束事件
的错误结束事件 -- 往往和错误边界事件或错误开始事件一起使用 例子
三、信号边界事件
测试当 为合同确认节点时 信号边界事件接受信号捕捉 改变流程,走合同变更节点,然后在回到
签订查看节点 ---类似于流程回退
3.1 参照上图新建流程 signal-boundary-event-test.bpmn
3.2 修改 signal-boundary-event-test.bpmn 定义信号边界事件,并在绑定事件中引入,
3.2 测试代码-- 在合同确认 节点时信号边界事件接受信号捕捉 改变流程,然后走合同变更流程
//测试 信号边界事件
public static void signalBoundaryEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("signal-boundary-event-test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
if("签订查看".equals(task.getName())){//启动流程开始节点 自动走到签订查看 节点 ,让其完成节点走下一个节点
System.out.println("签订查看-当前节点是 "+task.getName());
taskService.complete(task.getId());
}
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
if("合同确认".equals(task.getName())){//合同确认节点 -- 发信号 让信号边界事件捕捉改变流程,走合同变更节点
System.out.println("合同确认-当前节点是 "+task.getName());
/*百度 RuntimeService API
* signalEventReceived(String signalName)
通知流程引擎已收到名称为“signalName”的信号事件
signal-boundary-event-test.bpmn <signal id="contractChangeSignal" name="合同改变信号"></signal>
*/
runService.signalEventReceived("合同改变信号");
System.out.println("当前节点是 "+task.getName());
}
/*
输出 签订查看-当前节点是 签订查看
合同确认-当前节点是 合同确认
当前节点是 合同确认
*/
}
BoundaryEventTest.java
package com.xiangshuai.act.c16;
import java.util.List;
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;
import org.activiti.engine.task.TaskQuery;
/**
* 边界事件(是捕获事件) 测试
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤13-BPMN事件(4)边界事件
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤13-BPMN事件(4)边界事件
*/
public class BoundaryEventTest {
public static void main(String[] args) {
//timerBoundaryEventTest();
signalBoundaryEventTest();
}
//测试 定时器边界事件
public static void timerBoundaryEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer- boundary-event-test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
//线程睡眠70秒,这样 在第60秒的时候,就会触发初级工程师的 定时器边界事件(<timeDuration>PT1M</timeDuration>),跳到中级工程师处理节点
try {
Thread.sleep(70*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
/*
输出 当前任务是 初级工程师
当前任务是 中级工程师*/
}
//测试 信号边界事件
public static void signalBoundaryEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("signal-boundary-event-test.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
if("签订查看".equals(task.getName())){//启动流程开始节点 自动走到签订查看 节点 ,让其完成节点走下一个节点
System.out.println("签订查看-当前节点是 "+task.getName());
taskService.complete(task.getId());
}
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
if("合同确认".equals(task.getName())){//合同确认节点 -- 发信号 让信号边界事件捕捉改变流程,走合同变更节点
System.out.println("合同确认-当前节点是 "+task.getName());
/*百度 RuntimeService API
* signalEventReceived(String signalName)
通知流程引擎已收到名称为“signalName”的信号事件
signal-boundary-event-test.bpmn <signal id="contractChangeSignal" name="合同改变信号"></signal>
*/
runService.signalEventReceived("合同改变信号");
System.out.println("当前节点是 "+task.getName());
}
/*
输出 签订查看-当前节点是 签订查看
合同确认-当前节点是 合同确认
当前节点是 合同确认
*/
}
}