【问题标题】:How to trigger the execution of the compensation flow for the activities used within an Automatonymous state machine?如何触发自动状态机中使用的活动的补偿流程的执行?
【发布时间】:2018-11-22 13:42:17
【问题描述】:

我的活动在执行过程中不时抛出异常,因此我实现了Activity<TInstance> 的Faulted 方法来处理它,丢弃了Execute 方法中所做的更改。我认为 Automatonymous 下面有一些连线,使得当 Execute 方法抛出异常时执行 Faulted 方法,然后为已经执行的活动调用 Faulted 方法。事实证明不存在这样的事情,因为我的错误方法永远不会执行。

我应该自己在 try/catch 块中调用它们吗?我可以根据BehaviorContext 生成BehaviorExceptionContextProxy 并抛出异常。我唯一可以通过的下一个Behavior 将是插入到ActivityExecute 方法中的那个,但从逻辑上讲,这意味着我在错误的方向上进行补偿,因为下一个Behavior 实际上要在之后执行这个成功了,所以我会补偿太多。

我还尝试在状态机中使用Catch,它确实处理了异常,但是,当我只有ExceptionActivityBinder 出席。

有什么好的方法可以触发活动的补偿流程吗?

【问题讨论】:

  • 自动状态机用于 sagas,Activity 用于 Courier。您需要使用 Courier 来执行您的活动并让备用方案起作用。
  • 嗯,这感觉有点不直观,因为在对状态机进行建模时允许开箱即用地使用活动,并且必须为每个活动实现故障方法。无论如何,谢谢你的信息。我想我会使用状态机本身的 Catch 方法重写补偿。
  • 我不确定,也许我遗漏了一些东西,但我从未见过在自动状态机中使用活动。
  • 如果你想使用工厂,你可以通过 Activity 扩展方法将活动添加到你的状态机:github.com/MassTransit/MassTransit/blob/develop/src/… 或者如果你想当场实例化它们,只需通过 .Execute: github.com/MassTransit/Automatonymous/blob/develop/src/…

标签: masstransit saga automatonymous


【解决方案1】:

状态机中的活动(使用 Automatonymous)与 Courier 中的活动大不相同。不幸的是,它们都具有相同的名称,这可能会造成混淆。

当一个activity抛出异常时,会调用行为中下一个activity的Faulted方法。如果该方法是常规活动方法(例如 .Then、.Publish 等),则会跳过它,因为这些活动的 Faulted 方法只是调用行为中的下一个活动。

但是,Catch 活动可用于捕获异常并执行救援行为(这是一系列活动)。

无论哪种方式,在 Execute 方法中引发异常的 Activity 的 Faulted 方法都不会被调用。所以是的,您应该使用 try/catch,但允许异常从 Execute 方法流出,以便行为正确处理它。

【讨论】:

  • 是的,这就是我的预期,与 Alexey 交谈后有点困惑。感谢您的回答。这就解释了为什么我的活动 .Faulted 没有被执行。最后,在执行活动的状态下,我添加了 Catch 并发布了一个带有异常详细信息的事件,由另一个仅为缓解异常而创建的活动处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多