目录
- 定义
- 图形标记
- XML内容
- 使用示例
- 演示demo
定义
补偿边界事件可以为所依附的节点附加补偿处理器,通过关联连接到补偿处理器(compensation
handler)。补偿边界事件会在流程活动完成后根据情况(事务取消或者补偿中间事件触发)而触发,
当补偿边界事件触发时,执行它连接的补偿处理器。
补偿边界事件必须直接引用一个相关的补偿处理器。如果要使用一个活动补偿另一个活动的影
响,可以将其声明为补偿处理器(compensation handler)。补偿执行是通过活动附加的补偿边界事
件所关联的补偿处理器的 execution 来完成的。
图形标记
补偿边界事件显示为了一个普通的中间事件(内部有小圈的圆),里面有补偿图标。补偿图标
是白色的(无填充),表明是捕获语义。取消边界事件图标如下图所示,图中还显示了使用无
方向的关联,为边界事件设置补偿处理器:
XML内容
补偿边界事件的 XML 内容是普通边界事件的声明,包含一个 compensateEventDefinition 子元
素:
<process id="compensateBoundaryEventProcess">
<userTask id="usertask1" name="审批"></userTask>
<!-- 定义边界补偿-->
<boundaryEvent id="compensateBoundaryEvent1" name="Compensate"
attachedToRef="usertask1">
<compensateEventDefinition>
</boundaryEvent>
<!-- 定义补偿处理器 -->
<serviceTask id="serviceTask1" name="CompensationHandler" isForCompensation="true"
flowable:class="**.**.**.****"></serviceTask>
<!-- 定义关联 -->
<association id="association1" sourceRef="compensateBoundaryEvent1"
targetRef="serviceTask1" associationDirection="None"/>
</process>
注意,附加的补偿事件通过关联连接到补偿处理器,而不是通过序列流连接到补偿处理器。
使用示例
补偿边界事件与其它边界事件的行为策略不同,其它边界事件(比如信号边界事件)在其附加
活动到达时即被激活,当活动结束时,它也结束了,并且对应的事件订阅也会被取消。而补偿边界
事件与它们不同,补偿边界事件在附加活动成功完成后才激活,并创建相应的边界事件订阅。当补
偿边界事件触发或对应流程实例结束时,事件订阅才会删除。
在 Flowable 中,当执行流到达附加边界事件的活动时,会往 ACT_RU_EVENT_SUBSCR 表入事
件描述数据,边界事件所依附的活动完成后,这些事件描述数据会被删除,但是补偿边界事件所产
生的事件描述数据不会被删除(直到流程实例结束),因为即使活动完成后,这些补偿事件都有可
能被触发。
1、补偿边界事件使用时遵循以下规则:
- 当补偿被触发时,所有已成功完成的活动上附加的补偿边界事件对应的补偿处理器将被调
用,如果补偿边界事件依附活动尚未产生历史任务,则不会被触发。 - 附有补偿边界事件的活动完成若干次,那么当补偿边界事件触发后,这些补偿边界事件的执
行次数与活动的完成次数相等。 - 如果补偿边界事件依附在到多实例节点,则会为每个实例创建补偿事件订阅,补偿被触发的
次数与依附节点的循环多例任务的成功完成次数相等。 - 如果补偿边界事件依附的节点中包含循环,则每次执行活动时都会创建一个补偿事件订阅。
- 如果流程实例结束,订阅的补偿事件都会结束。
- 补偿边界事件不支持依附在内嵌子流程中。
2、补偿边界事件关联的补偿处理器需要注意以下几点:
- 补偿处理器不得有入口或出口顺序流。
- 补偿处理器必须通过单向的关联,连接到一个补偿边界事件。
- 要将一个活动声明为补偿处理器,需要将 isForCompensation 属性设置为 true,如。
⑷补偿处理器不在正常流程中执行,而只在流程抛出补偿事件时才会执行。
::: warning 注意
1、事务子流程被取消时,导致依附在事务子流程中的活动上的补偿边界事件触发。这种方式的示例请查看子流程中的事务子流程部分。
2、使用补偿中间事件来触发,导致补偿边界事件触发。这种方式的示例请查看本章补偿中间事件部分。
:::
演示demo
补偿边界事件
本文中内容和案例出自贺波老师的书《深入Activiti流程引擎:核心原理与高阶实战》,书中的介绍更全面、详细,推荐给大家。