# 中间抛出事件

补偿中间抛出事件用于触发补偿,当流程流转到补偿中间抛出事件时触发该流程已完成活动的边界补偿事件, 完成补偿操作后沿着中间抛出事件的外出顺序流继续流转。

WARNING

补偿中间抛出事件主要用于触发补偿,可用于指定活动或包含补偿事件的作用域触发补偿,通过执行与活动相关联的补偿 处理器来执行补偿。并遵循以下规则:

  • 针对某项活动进行补偿,则相关补偿处理器的执行次数与活动的完成次数想等。
  • 如果针对当前作用域进行补偿,则对当前作用域内的所有活动进行补偿,包括并行分支上的活动功。
  • 补偿是分级触发,如果补偿的活动是子流程,则为子流程中包含的所有活动触发补偿。如果自流程包含嵌套的活动,则补偿事件会递归的向下抛出,但 补偿事件不会传播到比该流程高的层级,如果补偿在子流程触发,不会传播到子流程作用域外的活动上。
  • 触发补偿时,补偿的执行次序与流程的执行顺序相反,这意味着最后完成活动最新执行。以此类推。
  • 补偿中间抛出事件可以用于补偿已经完成的事务子流程
  • 当多实例活动抛出补偿时,只有当所有实例都结束了,相关的补偿处理器才会执行。这意味着多实例活动在被补偿前必须先结束。
  • 补偿不会传播给调用活动创建的子流程实例

# 演示案例

foo

在用户任务节点,选择余额不足,得到上面补偿中间抛出事件的执行结果。点击Activiti演示站 (opens new window)

foo

在用户任务节点,选择资金充足,流程不会流转到补偿中间抛出事件。点击Activiti演示站 (opens new window)

foo

如果补偿被一个子流程的作用域触发,并且子流程包含带有补偿处理器的活动,则只有当子流程结束后,并且有补偿事件抛出时, 才会执行子流程中的补偿。如果子流程某些活动附加补偿处理器,但包含这些活动的子流程尚未结束,则补偿不会被执行。

TIP

上述案例"取消正式报名"服务任务的执行失效的情况:

  1. 银行卡支付失败,抛出补偿中间事件,但子流程尚未结束。
  2. 子流程“报名审核”用户任务在“取消报名”事件抛出之前完成,子流程已结束。
    “取消预报名”在以上两种情况均会被执行。