请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术发帖,必有回复! 做最受欢迎的Java论坛

疯狂Java联盟

 找回密码
 加入联盟
查看: 30|回复: 0

疯狂Activiti6连载(10)特别子流程

[复制链接]
发表于 2017-12-6 21:45:58 | 显示全部楼层 |阅读模式
本帖最后由 杨恩雄 于 2017-12-8 10:21 编辑

 本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

《疯狂工作流讲义(第2版)》电子书http://www.crazyit.org/thread-11738-1-1.html

Activiti6教学视频http://www.crazyit.org/thread-12159-1-1.html

特别子流程

要点

    特别子流程

本来还不会更新到子流程的相关知识,但今天有朋友问到Activiti6.0新支持的特别子流程(AdHocSubProcess),博主今天先发特别子流程的内容发了。

特别子流程

Activiti6.0增加了对特别子流程的支持,在特别子流程的容器中可以存放多个流程节点,这些节点在运行前不存在流程顺序,流程的顺序和执行,由执行时决定。笔者成书时,Activiti尚未提供特别子流程的API,并且Eclipse的流程设计器也不支持显示特别子流程,本例暂时使用普通的子流程代替。图13-10为本例的特别子流程。


13-10特别子流程

如图13-10所示,特别子流程中有两个用户任务,在定义流程时,并没有设定流程走向,当子流程完成后,就会到达“After task”。图13-10对应的BPMN文件内容,如代码清单13-12所示。

代码清单13-12codes\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属性,声明特别子流程中的节点,是会按顺序执行还是会并行,可配置为ParallelSequential设计完流程后,编写客户端代码部署并执行流程,如代码清单13-13所示。

代码清单13-13codes\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中的,使用runtimeServiceexecuteActivityInAdhocSubProcess方法让流程执行特别子流程中的第二个用户任务,则使用completeAdhocSubProcess方法完成特别子流程。运行代码清单13-13,输出如下:

开始流程后,执行流数量:2

让执行流到达第二个任务后,执行流数量:3

完成子流程的第二任务后,执行流数量:2

完成整个特别子流程后,当前任务名称:After task

根据输出结果可知,在特别子流程中,流程的走向完全由运行时,调用不同的API来决定。

 本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

《疯狂工作流讲义(第2版)》电子书http://www.crazyit.org/thread-11738-1-1.html

Activiti6教学视频http://www.crazyit.org/thread-12159-1-1.html

本书代码共享地址:https://gitee.com/yangenxiong/CrazyActiviti

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11063141号 )

GMT+8, 2017-12-18 20:39 , Processed in 0.231704 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表