补偿
补偿是指已经成功完成的撤销步骤,因为它们的结果和可能的副作用不再需要发生,而需要进行逆转。如果一个活动仍然是活动的,则不能对它进行补偿,而是需要取消它。在子过程的情况下,取消可以导致对活动中已经成功完成的部分的补偿。
补偿由补偿处理程序(compensation handler)执行。一个补偿处理程序执行必要的步骤来逆转一个活动的影响。对于子进程,补偿处理程序在其完成时可以访问子进程数据(“快照数据”)。
补偿是由一个抛出补偿事件触发的,它通常将由一个错误处理程序提出,作为取消的一部分,或由另一个补偿处理程序递归地提出。该事件指定要对显式或隐式执行补偿的活动。
补偿处理程序
补偿处理程序是一组未连接到BPMN模型的其他部分的活动。补偿处理程序从一个捕获补偿事件开始。捕获补偿事件要么是边界事件,如果是补偿事件子进程,则是处理程序的开始事件。
通过边界事件连接的补偿处理程序只能执行对原始活动的“黑盒”补偿。该补偿用一个专门的补偿活动来建模,该活动通过一个关联连接到边界事件(参见图10.121)。补偿活动可以是任务,也可以是子流程,它有一个标记,表明它仅用于补偿,并且在流程的正常流程之外。
图10.121-通过边界事件进行的补偿
补偿事件子流程包含在流程或子流程中(请参见图10.122)。与补偿活动一样,补偿事件子流程也在流程的正常流程之外。用虚线边界标记的事件子进程可以访问其父节点一部分的数据,这是其父节点完成时的时间点的快照。补偿事件子进程可以递归地触发对其父进程中包含的活动的补偿。
图10.122 -监控等级图
可以指定一个子进程可以被补偿,而无需定义补偿处理程序。当设置“子流程”属性时,指定隐式定义默认补偿,递归地补偿该子流程中所有成功完成的活动。
上面的图10.122中的示例包含了一个自定义的补偿事件子进程,由一个补偿启动事件触发。请注意,此补偿处理程序偏离默认补偿,因为它运行补偿活动的顺序与转发案例中的顺序不同;它还包括一个额外的活动(Activity)用于增加使子过程不能被偏离的逻辑过程。
补偿触发
补偿使用补偿抛出事件触发,它可以是中间事件,也可以是结束事件。需要补偿的活动会被引用到。如果活动从上下文中是清晰的,则不必指定它,并默认为当前的活动。一个典型的场景是子进程的内联错误处理程序无法恢复错误,因此将触发对该子进程的补偿。如果在“全局”上下文中没有指定任何活动,则流程中所有已完成的活动都将被补偿。
默认情况下,补偿是同步触发的,即补偿抛出事件等待被触发的补偿处理程序的完成。或者,通过将“抛出补偿事件”的“等待完成(waitForCompletion)”属性设置为false,可以无需等待完成即可触发补偿。
循环或多实例子进程通常存在多个实例。每个实例都有自己的补偿事件子进程实例,该实例可以访问在该特定实例完成时当前的特定快照数据。触发多实例子流程的补偿会单独触发其当前范围内所有实例的补偿。如果通过边界补偿处理程序指定了补偿,则还会对当前范围中的多实例子进程的每个实例调用此边界补偿处理程序一次。
错误处理与补偿的关系
以下项目定义了错误处理和补偿之间的关系:
●补偿采用“假定中止原则”,其后果如下:对失败活动的补偿导致空操作。
●当活动失败时,即因为抛出错误而离开时,错误处理程序有责任确保错误处理程序完成后不需要进一步的补偿。
●如果没有为特定子进程和特定错误指定错误事件子进程,则默认行为是如果抛出该错误,则自动调用该子进程中包含的所有活动的补偿,以确保审计和监视的行为。
发表回复