中间事件(有的是捕获,有的是抛出,有的既是抛出也是捕获)
- 定时器中间事件(捕获事件)
- 信号中间事件(既是抛出也可是捕获事件)
- 消息中间事件(捕获事件)
事件的学习掌握两点:什么时候会被触发,触发后有什么后果
一、定时器中间事件
测试当我下订单后,5秒后去卖家发货节点(在 下订单 与 卖家发货 用定时器中间事件隔开5秒后执行,就触发定时器中间事件让卖家发货节点进行处理
1.1 新建 timer-intermediate-event-test.bpmn
1.2 修改 timer-intermediate-event-test.bpmn
设置触发定时器中间事件 设为5 秒钟
1.3 修改activiti.cfg.xml
1.4 测试代码
//测试 定时器中间事件
public static void timerIntermediateEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer-intermediate-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());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println("当前时间是--"+df.format(new Date()));// new Date()为获取当前系统时间
}
try {
Thread.sleep(10*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//在下订单 节点complete 5秒后,就会触发 <timeDuration>PT5S</timeDuration> 跳到 卖家发货 节点
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
/* 输出结果
下订单当前节点是 下订单
当前时间是--2019-04-22 14:22:59
当前任务是 卖家发货
*/
}
二、信号中间事件(既是抛出也可是捕获事件)
二.一 测试信号中间捕获事件,测试案例如下
2.1.1 参照上图新建信号捕获事件流程 catch-signal-intermediate-event-test.bpmn
2.1.2 生成上图 系统生成菜单对应的处理类 CatchSignalDelegate.java
package com.xiangshuai.act.c17;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class CatchSignalDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution arg0) {
System.out.println("系统已生成菜单,等待用户支付");
}
}
2.1.3 修改 catch-signal-intermediate-event-test.bpmn,将处理类放入 等待生成菜单流程节点,并定义信号,并放入信号中间捕获事件节点
2.1.4 测试代码
/*测试 单测信号中间捕获事件 --- 整个流程设计 为
* 开始节点 -->自动执行了子定义类->完成系统生成菜单(执行不了有信号中间事件卡着),此时有用户支付一条task任务流程(task表中,执行流表中有二条)
* ->在用户支付节点 runService.signalEventReceived("单测信号中间捕获事件") 发信号,事件触发-》用户支付,系统完成订单节点 ,全部complete-》结束节点
* */
public static void catchSignalEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("catch-signal-intermediate-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();
taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有二条)
if("用户支付".equals(temptask.getName())){//先执行完系统生成菜单节点,再发信号给中间事件,改变执行执行流程
System.out.println("用户支付节点执行--》id为"+temptask.getId());
runService.signalEventReceived("单测信号中间捕获事件");// <signal id="catchSignalTest" name="单测信号中间捕获事件"></signal>
}
});
list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//有 用户支付,系统完成订单 两条task任务流程(task表中,执行流表中有三条)
System.out.println("还剩下的节点有"+temptask.getName());
taskService.complete(temptask.getId());
});
/*
系统已生成菜单,等待用户支付
用户支付节点执行--》id为13
还剩下的节点有用户支付
还剩下的节点有系统完成订单
*/
二.二 测试信号中间捕获事件和抛出事件一起测,测试案例如下
这个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute跑,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩
2.2.1参照上图新建信号捕获和抛出事件测试流程 catchAndThrow-signal-intermediate-event-test.bpmn
2.2.2 生成上图 系统生成菜单对应的处理类 CatchAndThrow SignalDelegate.java
package com.xiangshuai.act.c17;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class CatchAndThrowSignalDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution arg0) {
System.out.println("系统已生成菜单--信号捕获和抛出事件测试,等待用户支付");
}
}
2.2.3 修改 catchAndThrow-signal-intermediate-event-test.bpmn
,将处理类放入 等待生成菜单流程节点,并定义信号,并放入两个信号中间捕获事件节点和中间抛出事件节点
2.2.4 测试代码
/*同时测试信号中间捕获和抛出事件 ---
* 个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute跑
* ,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着
* ,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩
* */
public static void catchAndThrowSignalEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("catchAndThrow-signal-intermediate-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();
taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单和第三条执行流程(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有四条)
if("用户支付".equals(temptask.getName())){//执行完用户支付流程节点,自动发信号给两中间捕获事件
System.out.println("用户支付节点执行--》id为"+temptask.getId());
taskService.complete(temptask.getId());
}
});
list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 系统完成订单 一条task任务流程
System.out.println("还剩下的节点有"+temptask.getName());
taskService.complete(temptask.getId());
});
/* 输出
* 系统已生成菜单--信号捕获和抛出事件测试,等待用户支付
用户支付节点执行--》id为14
还剩下的节点有系统完成订单
*/
}
IntermediateEventTest.java
package com.xiangshuai.act.c17;
import java.text.SimpleDateFormat;
import java.util.Date;
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;
/**
* 中间事件(有的是捕获,有的是抛出,有的既是抛出也是捕获) 测试
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤14- BPMN事件(5)中间事件
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤14- BPMN事件(5)中间事件
*/
public class IntermediateEventTest {
public static void main(String[] args) {
//timerIntermediateEventTest();
//catchSignalEventTest();
catchAndThrowSignalEventTest();
}
//测试 定时器中间事件
public static void timerIntermediateEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("timer-intermediate-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());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println("当前时间是--"+df.format(new Date()));// new Date()为获取当前系统时间
}
try {
Thread.sleep(10*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//在下订单 节点complete 5秒后,就会触发 <timeDuration>PT5S</timeDuration> 跳到 卖家发货 节点
task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务是 "+task.getName());
/* 输出结果
下订单当前节点是 下订单
当前时间是--2019-04-22 14:22:59
当前任务是 卖家发货
*/
}
/*测试 单测信号中间捕获事件 --- 整个流程设计 为
* 开始节点 -->自动执行了子定义类->完成系统生成菜单(执行不了有信号中间事件卡着),此时有用户支付一条task任务流程(task表中,执行流表中有二条)
* ->在用户支付节点 runService.signalEventReceived("单测信号中间捕获事件") 发信号,事件触发-》用户支付,系统完成订单节点 ,全部complete-》结束节点
* */
public static void catchSignalEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("catch-signal-intermediate-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();
taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有二条)
if("用户支付".equals(temptask.getName())){//先执行完系统生成菜单节点,再发信号给中间事件,改变执行执行流程
System.out.println("用户支付节点执行--》id为"+temptask.getId());
runService.signalEventReceived("单测信号中间捕获事件");// <signal id="catchSignalTest" name="单测信号中间捕获事件"></signal>
}
});
list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//有 用户支付,系统完成订单 两条task任务流程(task表中,执行流表中有三条)
System.out.println("还剩下的节点有"+temptask.getName());
taskService.complete(temptask.getId());
});
/*
系统已生成菜单,等待用户支付
用户支付节点执行--》id为13
还剩下的节点有用户支付
还剩下的节点有系统完成订单
*/
}
/*同时测试信号中间捕获和抛出事件 ---
* 个流程图设计的目的是:选择商品节点完成后 并行网关三个excecute跑
* ,系统生成菜订单自动执行完后和第三条线都有 信号中间捕获事件堵着
* ,等着用户支付完成后自动吃法信号中间抛出时间发信号给他俩
* */
public static void catchAndThrowSignalEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("catchAndThrow-signal-intermediate-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();
taskService.complete(task.getId());//选择商品,直接complete调到下一个并行网关
List<Task> list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 用户支付一条任务流程,因为系统完成订单和第三条执行流程(前面还卡着中间事件,中间事件并不是任务) 一条task任务流程(task表中,执行流表中有四条)
if("用户支付".equals(temptask.getName())){//执行完用户支付流程节点,自动发信号给两中间捕获事件
System.out.println("用户支付节点执行--》id为"+temptask.getId());
taskService.complete(temptask.getId());
}
});
list = taskService.createTaskQuery().processInstanceId(pi.getId()).list();
list.forEach((temptask)->{//只有 系统完成订单 一条task任务流程
System.out.println("还剩下的节点有"+temptask.getName());
taskService.complete(temptask.getId());
});
/* 输出
* 系统已生成菜单--信号捕获和抛出事件测试,等待用户支付
用户支付节点执行--》id为14
还剩下的节点有系统完成订单
*/
}
}