此章节学习的目的,怎么样让流程往下走,不同的方式有不同的方法
如任务流程节点是UserTask
那么使用 TaskService.complete(Task.getId()); 使流程往下走
如任务流程节点是ReceiveTask
那么使用 RuntimeService.trigger(Execution.getId());
使流程往下走
流程触发
触发信号事件:
捕获事件(Catching):概念 流程一旦碰到捕获事件的时候,流程就会停在这里,等待外部发信号,一直处于捕获状态,直至收到外部给它发的信号,才会继续往下走
抛出事件(Throwing):流程一旦碰到抛出事件的时候,回往外抛出一个信息,不会等待,
流程继续往下走
捕获事件,抛出事件是放在流程中间,因此也叫中间事件 ,而开始节点是放在流程开始,因此叫开始事件
如任务流程 停在SignalCatchingEvent事件(信号捕获事件--也可叫信号捕获中间事件),如何使流程往下走
捕获事件的 signalEvent.bpmn的流程图画好后,还需再signalEvent.bpmn中
加标签对 信号捕获事件进行定义并引用
如下定义信号事件并引用
代码中使用 runService.signalEventReceived("testSignal");//signalEvent.bpmn 的 <signal id="testSignal" name="testSignal"></signal>
给它发信号,使流程往下走
消息捕获中间事件 ,如何使流程往下走--
// 让它往前走 --外部给 testMessage 发消息
//messageEvent.bpmn 的 <message id="testMsg" name="testMsg"></message>
/*
百度RuntimeService API messageEventReceived(String messageName, String executionId)
多第二参数执行流ID是于 消息捕获中间事件通知往下个节点走的最大区别,消息捕获事件没有执行流ID,相当于广播,
而消息捕获中间事件相当于订阅,只有此执行流继续往下走,其他执行流仍然等待中
*/
runService.messageEventReceived("testMsg", exe.getId());
项目结构如图
HandleTest.java
package com.xiangshuai.act.c12;
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.Execution;
import org.activiti.engine.runtime.ProcessInstance;
/**
* * @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤8-Activiti流程操作与数据查询
* 或 我的网盘\我的笔记学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤8-Activiti流程操作与数据查询
*
*/
public class HandleTest {
public static void main(String[] args) {
//receiveTaskTest();
//singleEventCatchingTest();
messageCatchingEventTest();
}
//任务流程节点是ReceiveTask,如何流转到下一个流程节点测试-通过RuntimeService.trigger(Execution.getId()) 流转到下一个流程节点;
public static void receiveTaskTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
// 部署
Deployment dep = rs.createDeployment()
.addClasspathResource("receiveTask.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
// 查当前的子执行流(此流程只有一个),Execution 对应act_ru_execution表 -- 此表保存运行时 当前节点 下的 主流程(主执行流)和子执行流 数据
Execution exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()//查当前的子执行流(此流程只有一个)
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 让它往前走
runService.trigger(exe.getId());
exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
}
/*
任务流程 停在SignalCatchingEvent事件(信号捕获事件),如何流转到下一个流程节点测试--通过
runService.signalEventReceived("testSignal");//singleEvent.bpmn 的 <signal id="testSignal" name="testSignal"></signal>
给它发信号,使流程往下走
*/
public static void singleEventCatchingTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
// 部署
Deployment dep = rs.createDeployment()
.addClasspathResource("signalEvent.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
// 查当前的子执行流(此流程只有一个),Execution 对应act_ru_execution表 -- 此表保存运行时 当前节点 下的 主流程(主执行流)和子执行流 数据
Execution exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()//查当前的子执行流(此流程只有一个)
.singleResult();
/*
断点查 act_ru_task 表中无 这个信号捕获事件 的任务,但此时却正处于信号捕获事件的节点上由此判断
act_ru_task 是存储运行的task任务的,不存储时间,但act_ru_execution 中有信号捕获事件 子执行流,
所以可判断act_ru_execution是存储信号捕获事件节点的
*/
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 输出结果 : 5, 当前节点:signalintermediatecatchevent2
// 让它往前走 --外部给 testSignal 发信号
runService.signalEventReceived("testSignal");//SingleEvent.bpmn 的 <signal id="testSignal" name="testSignal"></signal>
exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 输出结果 :5, 当前节点:usertask1
}
/*
任务流程 停在MessageCatchingEvent事件(消息捕获事件),如何流转到下一个流程节点测试--通过
runService.signalEventReceived("testMsg");//messageEvent.bpmn 的 <message id="testMsg" name="testMsg"></message>
给它发消息,使流程往下走
*/
public static void messageCatchingEventTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
// 部署
Deployment dep = rs.createDeployment()
.addClasspathResource("messageEvent.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
// 查当前的子执行流(此流程只有一个),Execution 对应act_ru_execution表 -- 此表保存运行时 当前节点 下的 主流程(主执行流)和子执行流 数据
Execution exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()//查当前的子执行流(此流程只有一个)
.singleResult();
/*
断点查 act_ru_task 表中无 这个捕获事件 的任务,但此时却正处于消息捕获事件的节点上由此判断
act_ru_task 是存储运行的task任务的,不存储时间,但act_ru_execution 中有消息捕获事件 子执行流,
所以可判断act_ru_execution是存储消息捕获事件节点的
*/
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 输出结果 :5, 当前节点:messageintermediatecatchevent1
// 让它往前走 --外部给 testMessage 发消息
//messageEvent.bpmn 的 <message id="testMsg" name="testMsg"></message>
/*
百度RuntimeService API messageEventReceived(String messageName, String executionId)
多第二参数执行流ID是于 消息捕获中间事件通知往下个节点走的最大区别,消息捕获事件没有执行流ID,相当于广播,
而消息捕获中间事件相当于订阅,只有此执行流继续往下走,其他执行流仍然等待中
*/
runService.messageEventReceived("testMsg", exe.getId());
exe = runService.createExecutionQuery()
.processInstanceId(pi.getId()).onlyChildExecutions()
.singleResult();
System.out.println(pi.getId() + ", 当前节点:" + exe.getActivityId());
// 输出结果 :5, 当前节点:usertask1
}
}