疯狂Activiti6.0连载(10) 特别子流程(AdHocSubProcess)
2017-10-17 21:01
615 查看
本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
特别子流程
本来还不会更新到子流程的相关知识,但今天有朋友问到Activiti6.0新支持的特别子流程(AdHocSubProcess),博主今天先发特别子流程的内容发了。
图13-10 特别子流程
如图13-10所示,特别子流程中有两个用户任务,在定义流程时,并没有设定流程走向,当子流程完成后,就会到达“After task”。图13-10对应的BPMN文件内容,如代码清单13-12所示。
代码清单13-12:codes\13\13.1\embeded-subprocess\resource\bpmn\AdHocProcess.bpmn
使用adHocSubProcess元素来配置特别子流程,其中该元素的ordering属性,声明特别子流程中的节点,是会按顺序执行还是会并行,可配置为Parallel或Sequential。设计完流程后,编写客户端代码部署并执行流程,如代码清单13-13所示。
代码清单13-13:
codes\13\13.1\embeded-subprocess\src\org\crazyit\activiti\AdHocProcess.java
代码清单13-13中的(一),使用runtimeService的executeActivityInAdhocSubProcess方法让流程执行特别子流程中的第二个用户任务,(二)则使用completeAdhocSubProcess方法完成特别子流程。运行代码清单13-13,输出如下:
根据输出结果可知,在特别子流程中,流程的走向完全由运行时,调用不同的API来决定。
本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti
京东购买地址:https://item.jd.com/12246565.html
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
10 特别子流程
本文要点 特别子流程
本来还不会更新到子流程的相关知识,但今天有朋友问到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
<process id="simpleSubProcess"> <startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="adhocSubProcess" /> <adHocSubProcess id="adhocSubProcess" ordering="Sequential"> <userTask id="subProcessTask" name="Task in subprocess" /> <userTask id="subProcessTask2" name="Task2 in subprocess" /> </adHocSubProcess> <sequenceFlow id="flow2" sourceRef="adhocSubProcess" targetRef="afterTask" /> <userTask id="afterTask" name="After task" /> <sequenceFlow id="flow3" sourceRef="afterTask" targetRef="theEnd" /> <endEvent id="theEnd" /> </process>
使用adHocSubProcess元素来配置特别子流程,其中该元素的ordering属性,声明特别子流程中的节点,是会按顺序执行还是会并行,可配置为Parallel或Sequential。设计完流程后,编写客户端代码部署并执行流程,如代码清单13-13所示。
代码清单13-13:
codes\13\13.1\embeded-subprocess\src\org\crazyit\activiti\AdHocProcess.java
public class AdHocProcess { /** * @param args */ public static void main(String[] args) { // 创建流程引擎 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
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti
相关文章推荐
- 疯狂Activiti6连载(10)特别子流程
- 疯狂Activiti6.0连载(4)流程引擎数据源配置
- 疯狂Activiti6.0连载(22)流程存储Web Service
- 疯狂Activiti6.0连载(22)流程存储Web Service
- 疯狂Activiti6.0连载(5)流程引擎的创建
- 疯狂Activiti6.0连载(11)Activiti6的流程控制逻辑
- 疯狂Activiti6.0连载(3)Activiti开发环境搭建
- 疯狂Activiti6.0连载(25)BPMN结束事件
- 疯狂Activiti6.0连载(13)DMN的XML规范
- 疯狂Activiti6.0连载(13)DMN的XML规范
- 疯狂Activiti6.0连载(14)Activiti运行第一个DMN应用
- 疯狂Activiti6.0连载(6)邮件服务器与history配置
- 疯狂Activiti6.0连载(24)BPMN开始事件
- 疯狂Activiti6.0连载(24)BPMN开始事件
- 疯狂Activiti6.0连载(29)任务监听器
- 疯狂Activiti6.0连载(7)Activit的设计模式
- 疯狂Activiti6.0连载(15)DMN规则匹配表达式
- 疯狂Activiti6.0连载(20)Activiti与Spring Boot
- 疯狂Activiti6.0连载(23)BPMN事件分类与事件定义
- 疯狂Activiti6.0连载(27)BPMN中间事件