事件定义
当一个流程操作完成后,其结果可能不合符预期,这时可以使用补偿机制对已经完成的操作流程进行补偿处理。
补偿事件主要用于触发补偿机制。
如需在线体验文章的案例演示,请访问JeecgFlow
边界事件
补偿边界事件可为所依附的流程活动附加补偿处理器,补偿处理器通过单项关联补偿边界事件。 补偿边界事件在流程活动
完成后根据实际情况出发,当补偿边界事件被触发时,执行它所连接的补偿处理器。
补偿边界事件必须通过直接引用设置唯一的补偿处理器补偿边界事件与其他边界事件的行为策略不同,其他边界事件(如信号事件)在流程流转到所依附的活动时被激活,在流程活动结束时结束,
并且对应的事件订阅也会被取消,而补偿边界事件在所依附的活动结束后才被激活,并且创建相应的事件边界订阅,在补偿边界触发或对应流程
实例结束时,事件定于才会被删除。
补偿边界事件一般在两种情况下被触发:
1.由补偿中间抛出事件触发补偿边界事件。
2.事务子流程被取消,导致依附在事务子流程上的补偿边界事件被触发
补偿边界事件所产生的订阅数据(ACT\_RU\_EVENT\_SUBSCR)不会被删除(直到补偿边界事件触发或流程实例结束)。
因为即使流程活动完成了,所依附的补偿边界事件仍有可能被触发。
* 当补偿被触发时,所有已完成的活动所依附的补偿边界事件对应的补偿处理器将被吊用,如果补偿边界事件所依附的活动尚未产生历史任务,则不会被触发
* 如果补偿边界的活动完成N次,则补偿边界触发后,这些补偿边界的执行次数与活动完成次数想等。
* 如果补偿事件依附在多实例活动上,则会为每个实例创建补偿事件订阅,补偿边界事件被触发的次数与所所依附活动的循环多实例的成功完成次数想等。
* 如果流程实例结束,订阅的补偿事件都会结束
* 边界补偿事件不支持依附在内嵌的子流程中
中间抛出事件
补偿中间抛出事件用于触发补偿,当流程流转到补偿中间抛出事件时触发该流程已完成活动的边界补偿事件,
完成补偿操作后沿着中间抛出事件的外出顺序流继续流转。
::: warning
补偿中间抛出事件主要用于触发补偿,可用于指定活动或包含补偿事件的作用域触发补偿,通过执行与活动相关联的补偿
处理器来执行补偿。并遵循以下规则:
- 针对某项活动进行补偿,则相关补偿处理器的执行次数与活动的完成次数想等。
- 如果针对当前作用域进行补偿,则对当前作用域内的所有活动进行补偿,包括并行分支上的活动功。
- 补偿是分级触发,如果补偿的活动是子流程,则为子流程中包含的所有活动触发补偿。如果自流程包含嵌套的活动,则补偿事件会递归的向下抛出,但
补偿事件不会传播到比该流程高的层级,如果补偿在子流程触发,不会传播到子流程作用域外的活动上。 - 触发补偿时,补偿的执行次序与流程的执行顺序相反,这意味着最后完成活动最新执行。以此类推。
- 补偿中间抛出事件可以用于补偿已经完成的事务子流程
- 当多实例活动抛出补偿时,只有当所有实例都结束了,相关的补偿处理器才会执行。这意味着多实例活动在被补偿前必须先结束。
- 补偿不会传播给调用活动创建的子流程实例
:::
演示案例
在用户任务节点,选择余额不足,得到上面补偿中间抛出事件的执行结果。点击Activiti演示站
在用户任务节点,选择资金充足,流程不会流转到补偿中间抛出事件。点击Activiti演示站
如果补偿被一个子流程的作用域触发,并且子流程包含带有补偿处理器的活动,则只有当子流程结束后,并且有补偿事件抛出时,
才会执行子流程中的补偿。如果子流程某些活动附加补偿处理器,但包含这些活动的子流程尚未结束,则补偿不会被执行。
上述案例"取消正式报名"服务任务的执行失效的情况:
银行卡支付失败,抛出补偿中间事件,但子流程尚未结束。
子流程"报名审核"用户任务在"取消报名"事件抛出之前完成,子流程已结束。
"取消预报名"在以上两种情况均会被执行。