BPMN其他元素(1)子流程
子流程介绍
- 嵌入式子流程
- 调用式子流程
- 事件子流程
- 事务子流程
- 特别子流程
一、嵌入式子流程
1.1 参照如上图 创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA类(ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)
新建 EmbededSubProcess.bpmn
新建ErrorJavaDelegate.java
package com.xiangshuai.act.c22;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
import org.activiti5.engine.delegate.BpmnError;
public class ErrorJavaDelegate implements JavaDelegate{
@Override
public void execute(DelegateExecution arg0) {
System.out.println("执行子流程Service Task的Java Delegate, 抛出错误");
throw new BpmnError("myError");
}
}
1.2 修改 EmbededSubProcess.bpmn
1.3 测试方法
/*
嵌入式子流程 test
创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA类
(ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)
*/
public static void testPropertyInjection(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("EmbededSubProcess.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
/*
启动流程,自动执行完 ServiceTask对应的JAVA类ErrorJavaDelegate 执行其重写方法execute 输出System.out.println("执行子流程Service Task的Java Delegate, 抛出错误");
后抛出new BpmnError("myError"); 错误让 错误边界事件扑捉到,改变其原有流程,走到 Error Task节点
*/
//
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获得当前执行节点
System.out.println("当前 节点为"+ task.getName());//当前 节点为Error Task
}
二、调用式子流程 :对于一个流程会被多个流程调用,那么可以把这个流程弄成调用式
子流程供别的流程调用
如下图,这个审批流程会被多个流程调用,那么我们新建一个此 调用式
子流程
子流程
比如如果员工请假需要 走如上审批流程,那么只需要加个CallActivity节点流程,并在此节点便签加个属性 calledElement="审批流程process标签的Id"即可
2.1 参照上两图新建 一个调用式子流程CallActivitySub.bpmn 和调用流程Offwork.bpmn
新建调用式子流程 CallActivitySub.bpmn
修改 CallActivitySub.bpmn
修改 Offwork.bpmn ,更改Offwork.bpmn 的 callActivity标签 加个calledElement=" callActivitySub " 属性--这个callActivitySub是CallActivitySub.bpmn的<process 的id
2.2 测试方法
/***
* 测试 调用 调用式子流程 ,只要注意,在员工填写完,走callActivity 调用子流程后
* 会生成两个流程实例--ProcessInstance ,一子(调用式子流程)一父 即可
* 获得子流程实例的方法 Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
*/
public static void testCallActivity(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment()
.addClasspathResource("CallActivitySub.bpmn")
.addClasspathResource("Offwork.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).processDefinitionKey("myProcess").singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务名称:" + task.getName());
taskService.complete(task.getId());
//调用 子流程会生成两个流程实例,下面是获得调用式子流程 的方法
ProcessInstance piSub = runService.createProcessInstanceQuery().superProcessInstanceId(pi.getId()).singleResult();
task = taskService.createTaskQuery().processInstanceId(piSub.getId()).singleResult();
System.out.println("当前任务名称:" + task.getName()); //子流程的总监审批节点
/**
* 输出:27508
当前任务名称:员工填写
当前任务名称:总监审批
* */
}
三、事件子流程
四、事务子流程
可参照之前写的这个流程图的代码
五、特别子流程
测试java类 SubProcessTest.java
package com.xiangshuai.act.c22;
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.delegate.DelegateTask;
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;
import org.activiti5.engine.delegate.BpmnError;
/**
* @author lqx
* BPMN其他元素(1)子流程
子流程介绍
嵌入式子流程
调用式子流程
事件子流程
事务子流程
特别子流程
文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤19- 23 BPMN其他元素(1)子流程
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤19- 23 BPMN其他元素(1)子流程
*/
public class SubProcessTest {
public static void main(String[] args) {
//testPropertyInjection();
testCallActivity();
}
/*
嵌入式子流程 test
创建嵌入式子流程流程图EmbededSubProcess.bpmn,并创建Sub Task这个服务流程对应的JAVA类
(ErrorJavaDelegate 实现JavaDelegate重写方法execute抛出错误(new BpmnError("myError"))已让错误边界事件捕获)
*/
public static void testPropertyInjection(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("EmbededSubProcess.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
/*
启动流程,自动执行完 ServiceTask对应的JAVA类ErrorJavaDelegate 执行其重写方法execute 输出System.out.println("执行子流程Service Task的Java Delegate, 抛出错误");
后抛出new BpmnError("myError"); 错误让 错误边界事件扑捉到,改变其原有流程,走到 Error Task节点
*/
//
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//获得当前执行节点
System.out.println("当前 节点为"+ task.getName());//当前 节点为Error Task
}
/***
* 测试 调用 调用式子流程 ,只要注意,在员工填写完,走callActivity 调用子流程后
* 会生成两个流程实例--ProcessInstance ,一子(调用式子流程)一父 即可
* 获得子流程实例的方法 Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
*/
public static void testCallActivity(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment()
.addClasspathResource("CallActivitySub.bpmn")
.addClasspathResource("Offwork.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).processDefinitionKey("myProcess").singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println(pi.getId());
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
System.out.println("当前任务名称:" + task.getName());
taskService.complete(task.getId());
//调用 子流程会生成两个流程实例,下面是获得调用式子流程 的方法
ProcessInstance piSub = runService.createProcessInstanceQuery().superProcessInstanceId(pi.getId()).singleResult();
task = taskService.createTaskQuery().processInstanceId(piSub.getId()).singleResult();
System.out.println("当前任务名称:" + task.getName()); //子流程的总监审批节点
/**
* 输出:27508
当前任务名称:员工填写
当前任务名称:总监审批
* */
}
}