本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
本文要点
特别子流程
本来还不会更新到子流程的相关知识,但今天有朋友问到Activiti6.0新支持的特别子流程(AdHocSubProcess),博主今天先发特别子流程的内容发了。
Activiti6.0增加了对特别子流程的支持,在特别子流程的容器中可以存放多个流程节点,这些节点在运行前不存在流程顺序,流程的顺序和执行,由执行时决定。笔者成书时,Activiti尚未提供特别子流程的API,并且Eclipse的流程设计器也不支持显示特别子流程,本例暂时使用普通的子流程代替。图13-10为本例的特别子流程。
图13-10特别子流程
如图13-10所示,特别子流程中有两个用户任务,在定义流程时,并没有设定流程走向,当子流程完成后,就会到达“After task”。图13-10对应的BPMN文件内容,如代码清单13-12所示。
代码清单13-12:codes\13\13.1\embeded-subprocess\resource\bpmn\AdHocProcess.bpmn
targetRef="afterTask" />
使用adHocSubProcess元素来配置特别子流程,其中该元素的ordering属性,声明特别子流程中的节点,是会按顺序执行还是会并行,可配置为Parallel或Sequential。设计完流程后,编写客户端代码部署并执行流程,如代码清单13-13所示。
代码清单13-13:codes\13\13.1\embeded-subprocess\src\org\crazyit\activiti\AdHocProcess.java
//创建流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//得到流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
//得到运行时服务组件
RuntimeService runtimeService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
//部署流程文件
repositoryService.createDeployment()
.addClasspathResource("bpmn/AdHocProcess.bpmn").deploy();
//启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceByKey("simpleSubProcess");
System.out.println("开始流程后,执行流数量:"
+ runtimeService.createExecutionQuery()
.processInstanceId(pi.getId()).count());
//查询子流程的执行流
Execution exe = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId()).activityId("adhocSubProcess")
.singleResult();
//让执行流到达第二个任务
runtimeService.executeActivityInAdhocSubProcess(exe.getId(),①
"subProcessTask2");
//查询执行流数量
System.out.println("让执行流到达第二个任务后,执行流数量:"
+ runtimeService.createExecutionQuery()
.processInstanceId(pi.getId()).count());
//完成第二个任务
Task subProcessTask2 = taskService.createTaskQuery()
.processInstanceId(pi.getId())
.taskDefinitionKey("subProcessTask2").singleResult();
taskService.complete(subProcessTask2.getId());
//查询执行流数量
System.out.println("完成子流程的第二任务后,执行流数量:"
+ runtimeService.createExecutionQuery()
.processInstanceId(pi.getId()).count());
//完成特别子流程
runtimeService.completeAdhocSubProcess(exe.getId());②
//查询数量
System.out.println("完成整个特别子流程后,当前任务名称:"
+ taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult().getName());
代码清单13-13中的①,使用runtimeService的executeActivityInAdhocSubProcess方法让流程执行特别子流程中的第二个用户任务,②则使用completeAdhocSubProcess方法完成特别子流程。运行代码清单13-13,输出如下:
开始流程后,执行流数量:2
让执行流到达第二个任务后,执行流数量:3
完成子流程的第二任务后,执行流数量:2
完成整个特别子流程后,当前任务名称:After task
根据输出结果可知,在特别子流程中,流程的走向完全由运行时,调用不同的API来决定。
本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
本书代码共享地址:https://gitee.com/yangenxiong/CrazyActiviti