结束事件: --按照事件的位置,开始事件一般都市捕获事件,结束时间一般都是抛出事件
- 无指定结束事件 -- 什么都没指定直接就结束掉了
- 错误结束事件 -- 往往和错误边界事件或错误开始事件一起使用
- 取消结束事件 -- 往往和边界事件一起用,抛出一个错误,触发边界事件
- 终止结束事件 -- 终止流程
一. 测试错误结束事件
错误结束事件(抛出错误)-- 错误边界事件
错误结束事件(抛出错误)-- 错误开始事件(捕获别人抛出的错误开始流程)
1.1 测试 错误结束事件 总会抛出错误 -- 然后让错误开始事件 捕获到错误,开始执行错误捕获事件流程
新建 end_event_error.bpmn(可直接将E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤11- BPMN事件(2)开始事件
Start-event-test 项目下的start_event_error.bpmn COPY过来进行修改下即可) --一个正常流程(最后一个节点是错误结束事件而非普通结束事件)及处理正常流程错误信息的错误处理流程
1.2修改end_event_error.bpmn -- 给Count People和 Event sub Process 这两个Service Task节点加对应的处理类(全类名--下图的包名是有误的),及定义错误信息标签,并在错误结束事件流程节点上进行引用,如下图,
1.3 测试代码
//测试 错误开始事件
public static void errorEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
Deployment dep = rs.createDeployment().addClasspathResource("end_event_error.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
/* 启动流程 输出结果
清点人数,人数不对,要抛出错误信息,给错误子流程 --- CountDelegate execute方法
收到正常流程的错误信息通知,人数不对,执行上报任务 --- ReportDelegate execute方法
*/
}
二. 测试取消结束事件
取消结束事件 注意两点
- 只能使用在事务子流程中
- 与取消边界事件一起使用 (因为没有取消开始事件)
2.1 新建取消结束事件流程cancle_end_event.bpmn -- 取消结束事件在事务子流程中,并于取消边界事件一起使用
2.2 修改 cancle_end_event.bpmn
注意 是补偿这个便签是 true 而不是如下图的ture
2.3 测试代码
//测试取消结束事件
public static void cancleEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("cancle_end_event.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()); // Tran Task任务节点
taskService.complete(task.getId());
/*
Tran Task任务节点 完成后会到 取消结束事件,取消结束事件会触发补偿边界事件,这样补偿边界的处理类CompenstaionDelegate
会执行execute()方法 输出进行补偿处理,同时会触发取消边界事件
*/
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前流程任务:" + task.getName()); //触发取消边界事件 所以在Cancle任务节点
}
三. 测试 终止结束事件 --- 会将整个流程结束掉,不管并行网关还有多少流程没执行
3.1 新建 终止结束事件的流程图 terminal_end_event. bpmn
3.2测试方法
// 测试 终止结束事件 --- 会将整个流程结束掉,不管并行网关还有多少流程没执行
public static void terminalEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("terminal_end_event.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
long count = runService.createExecutionQuery().processInstanceId(pi.getId()).count();//执行流数据,三条,一条主执行流,两条子执行流
System.out.println("终止前执行流数量 "+count);
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((task)->{
if("task1".equals(task.getName())){//如果是task1就 执行流程,好让其执行往终止结束事件
taskService.complete(task.getId());
}
});
//终止结束事件 执行后
count = runService.createExecutionQuery().processInstanceId(pi.getId()).count();;//目前有几条流程在跑
System.out.println("终止后执行流数量 "+count);
}
EndEventTest.java
package com.xiangshuai.act.c15;
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\复习步骤12- 16 BPMN事件(3)结束事件
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤12- 16 BPMN事件(3)结束事件
*/
public class EndEventTest {
public static void main(String[] args) {
//errorEndEventTest();
//cancleEndEventTest();
terminalEndEventTest();
}
//测试 错误开始事件
public static void errorEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
Deployment dep = rs.createDeployment().addClasspathResource("terminal_end_event.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
/* 启动流程 输出结果
清点人数,人数不对,要抛出错误信息,给错误子流程 --- CountDelegate execute方法
收到正常流程的错误信息通知,人数不对,执行上报任务 --- ReportDelegate execute方法
*/
}
//测试取消结束事件
public static void cancleEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("cancle_end_event.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()); // Tran Task任务节点
taskService.complete(task.getId());
/*
Tran Task任务节点 完成后会到 取消结束事件,取消结束事件会触发补偿边界事件,这样补偿边界的处理类CompenstaionDelegate
会执行execute()方法 输出进行补偿处理,同时会触发取消边界事件
*/
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前流程任务:" + task.getName()); //触发取消边界事件 所以在Cancle任务节点
}
// 测试 终止结束事件 --- 会将整个流程结束掉,不管并行网关还有多少流程没执行
public static void terminalEndEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("terminal_end_event.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
long count = runService.createExecutionQuery().processInstanceId(pi.getId()).count();//执行流数据,三条,一条主执行流,两条子执行流
System.out.println("终止前执行流数量 "+count);
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((task)->{
if("task1".equals(task.getName())){//如果是task1就 执行流程,好让其执行往终止结束事件
taskService.complete(task.getId());
}
});
//终止结束事件 执行后
count = runService.createExecutionQuery().processInstanceId(pi.getId()).count();;//目前有几条流程在跑
System.out.println("终止后执行流数量 "+count);
}
}