疯狂Activiti6.0连载(26)BPMN边界事件

本文详细介绍了BPMN中的边界事件,包括定时器、错误、信号和补偿边界事件的使用场景和特点。通过实例解析了每个类型的边界事件如何在流程中中断或改变当前活动。还特别强调了补偿边界事件在事务子流程中的重要性,以及其在流程活动完成后可能触发的情况。
摘要由CSDN通过智能技术生成

 本文节选自《疯狂工作流讲义(第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

 

BPMN边界事件

BPMN2.0的事件分类中,边界事件被划分到中间事件中,BPMN2.0中将狭义的中间事件和边界事件,统称为中间事件。本书所称的中间事件为狭义的中间事件,即可以单独作为流程元素存在于流程中的事件为中间事件,而附属于某个流程元素(如任务、子流程等)的事件为边界事件。边界事件是Catching事件,会等待被触发,当边界事件被触发,当前的活动会被中断,并且当前的顺序流会发生转移。

BPMN2.0中定义了以下的边界事件:消息Message边界事件、定时器Timer边界事件、升级Escalation边界事件、错误Error边界事件、取消Cancel边界事件、补偿Compensation边界事件、条件Conditional边界事件、信号Signal边界事件、组合Multiple边界事件和并行组合Parallel Multiple边界事件。

定时器边界事件

定时器边界事件是附属在流程活动中的事件,当流程到达了流程活动时,定时器启动,当定时器边界事件被触发后,当前的活动会被中断,流程会从定时器边界事件离开流程活动。定时器边界事件使用在一些限时的业务流程中较为合适。假设当前有一个手机维修的流程,从接收到客户报障开始计算,先由初级工程负责修理手机,如果超过1个小时该工程师仍然未将手机修理好,就交由中级工程师负责修理,此时可以为初级工程师的流程任务加入定时边界事件。该业务流程如图11-9所示。


11-9 含有定时器边界事件的维修业务流程

11-9定义的流程开始后,任务会到达“初级工程师处理维修”的UserTask,这个UserTask有一个定时器边界事件,如果定时器边界事件触发,流程将会转到“中级工程师处UserTask11-9对应的流程文件如代码清单11-21所示。

代码清单11-21codes\11\11.5\boundary-event\resource\bpmn\TimerBoundaryEvent.bpmn

<process id="tbProcess" name="tbProcess">

<startEvent id="startevent1" name="Start"></startEvent>

<userTask id="servicetask1" name="初级工程师处理维修"></userTask>

<boundaryEvent id="boundarytimer1" cancelActivity="true"

attachedToRef="servicetask1">

<timerEventDefinition>

<timeDuration>PT1M</timeDuration>

</timerEventDefinition>

</boundaryEvent>

<userTask id="servicetask2" name="中级工程师处理维修"></userTask>

<endEvent id="endevent1" name="End"></endEvent>

<sequenceFlow id="flow1" name="" sourceRef="startevent1"

targetRef="servicetask1"></sequenceFlow>

<sequenceFlow id="flow2" name="" sourceRef="servicetask1"

targetRef="endevent1"></sequenceFlow>

<sequenceFlow id="flow3" name="" sourceRef="boundarytimer1"

targetRef="servicetask2"></sequenceFlow>

<sequenceFlow id="flow4" name="" sourceRef="servicetask2"

targetRef="endevent1"></sequenceFlow>

</process>

代码清单11-21粗体字代码,定义了一个定时器边界事件,在定时器事件定义中,使用了timeDuration元素,设置了该定时器事件将会在1分钟后触发,换言之,如果这个“初级工程师处理维修”的任务在1分钟内不完成的话,将会触发这个边界事件,流程会转向“中级工程师处理维修”的用户任务需要注意的是,业务中定义的是初级工程师1个小时内处理不完就交给中级工程师处理,为了能更快到看到代码效果,案例中将初级工程师的修理时间设定为1分钟 。代码清单11-22加载该流程文件。

代码清单11-22codes\11\11.5\boundary-event\src\org\crazyit\activiti\TimerBoundaryEvent.java

// 创建流程引擎

ProcessEngineImpl engine = (ProcessEngineImpl) ProcessEngines

.getDefaultProcessEngine();

// 得到流程存储服务组件

RepositoryService repositoryService = engine.getRepositoryService();

// 得到运行时服务组件

RuntimeService runtimeService = engine.getRuntimeService();

// 获取流程任务组件

TaskService taskService = engine.getTaskService();

// 部署流程文件

repositoryService.createDeployment()

.addClasspathResource("bpmn/TimerBoundaryEvent.bpmn").deploy();

// 启动流程

runtimeService.startProcessInstanceByKey("tbProcess");

// 查询当前任务

Task currentTask = taskService.createTaskQuery().singleResult();

System.out.println("当前处理任务名称:" + currentTask.getName());

// 停止70

Thread.sleep(1000 * 70);

// 重新查询当前任务

currentTask = taskService.createTaskQuery().singleResult();

System.out.println("当前处理任务名称:" + currentTask.getName());

代码清单11-22中,启动流程后,执行任务查询,输出当前任务名称为“初级工程师处理维修”,代码清单11-22粗体字代码,停止70秒后再进行任务查询,此时当前的任务已经变为“中级工程师处理维修”。需要注意的是,在程序运行的过程中,不同的硬件上可能会出现误差,为了能更准确的看到效果,1分钟后所执行的边界面事件,笔者在代码清单11-22中,给了70秒它去运行。运行代码清单11-22,输出结果如下:

当前处理任务名称:初级工程师处理维修

当前处理任务名称:中级工程师处理维修

由此可见,当超过规定的时间后流程仍然停留在UserTask,则定时器边界事件会触发,流程转向另外的UserTask

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大仙的程序空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值