Flowable入门系列文章36 - Activity解读 12
Posted 分享牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章36 - Activity解读 12相关的知识,希望对你有一定的参考价值。
补偿中间投掷事件
描述
中间投掷补偿事件可以用来触发补偿。
触发补偿:可以针对指定活动或主管补偿事件的范围触发补偿。通过执行与活动相关联的补偿处理程序来执行补偿。
- 如果对某项活动进行补偿,则相关的补偿处理程序执行的次数与活动成功完成的次数相同。
- 如果对当前范围进行补偿,则对当前范围内的所有活动进行补偿,包括并行分支机构的活动。
- 补偿是分级触发的:如果要补偿的活动是一个子过程,则为子过程中包含的所有活动触发补偿。如果子进程嵌套活动,则会递归地引
发补偿。但是,薪酬不会传播到流程的“上层”:如果在子流程内触发补偿,则不会将其传播到子流程范围之外的活动。BPMN规范规
定,对于“同一级别的子流程”的活动,触发补偿。 - 在Flowable中,补偿是以相反的顺序执行的。这意味着最后完成的任何活动首先被补偿,依此类推。
- 中间投掷补偿事件可以用来补偿成功竞争的交易子过程。
注意:如果在包含子流程的范围内引发补偿,并且子流程包含具有补偿处理程序的活动,则只有在引发补偿时,补偿才会传播到子流程。如
果嵌套在子流程中的某些活动已经完成并且附加了补偿处理程序,那么如果包含这些活动的子流程尚未完成,则不执行补偿处理程序。考虑
下面的例子:
在这个过程中,我们有两个并发执行:一个执行嵌入式子进程,一个执行“充值信用卡”活动。假设两个执行都已开始,并且第一个并发执行正在等待用户完成“检查预订”任务。第二次执行“收费信用卡”活动并抛出错误,导致“取消预订”事件触发赔偿。此时并行子过程尚未完成,这意味着补偿事件不会传播到子过程,因此“取消酒店预订”补偿处理程序不会执行。如果在执行“取消预订”之前用户任务(并因此嵌入的子处理)完成,
过程变量:补偿嵌入式子过程时,用于执行补偿处理程序的执行可以访问子过程完成执行时所处状态下的子过程的本地过程变量。为了达到这个目的,采取了与范围执行相关联的过程变量的快照(为执行子过程而创建的执行)。从这里,有几个含义如下:
- 补偿处理程序不能访问添加到子流程范围内创建的并发执行的变量。
- 与层次结构中较高级别执行相关联的进程变量(例如,与进程实例执行相关的进程变量)不包含在快照中:补偿处理程序可以在引发补偿时处于这些进程变量的状态。
- 变量快照仅用于嵌入式子进程,不用于其他活动。
目前的限制:
- waitForCompletion="false"目前不受支持。当使用中间投掷补偿事件触发补偿时,事件仅在补偿成功完成后才被保留。
- 补偿本身目前是通过并发执行来执行的。并发执行按补偿活动完成的相反顺序启动。
- 补偿不会传播给由呼叫活动产生的子流程实例。
图形表示法
一个中间补偿投掷事件被视为一个典型的中间事件(内圈小圈),里面有补偿图标。补偿图标是黑色(填充),以指示其抛出的语义。
XML表示
补偿中间事件被定义为中间投掷事件。特定类型的子元素在这种情况下是一个compensationEventDefinition元素。
<intermediateThrowEvent id="throwCompensation">
<compensateEventDefinition />
</intermediateThrowEvent>
此外,可选参数activityRef可用于触发特定范围或活动的补偿:
<intermediateThrowEvent id="throwCompensation">
<compensateEventDefinition activityRef="bookHotel" />
</intermediateThrowEvent>
上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
以上是关于Flowable入门系列文章36 - Activity解读 12的主要内容,如果未能解决你的问题,请参考以下文章
Flowable入门系列文章20 - 基本的Flowable概念一
Flowable入门系列文章80 - Flowable Designer部署功能