在新的传奇中重新处理特定的大众运输消息并最终确定当前

时间:2019-07-09 07:13:21

标签: masstransit saga automatonymous

我正在将Masstransit 5.1.4与sagas一起使用。我有一个传奇,我想实现以下行为:

  • 收到StartMsg后->转换为“活动”状态
  • 处于活动状态时,将处理多个事件
  • 如果在这种状态下接收到StartMsg,则当前传奇完成,并在新的传奇实例中重新处理StartMsg

我该如何实现?

这是一个小的伪代码

Initially(
    When(StartEvt)
        .Then(...)
        .TransitionTo(Active)
    );
During(Active,
    When(OneEvt)
        .Then(...),
    When(AnotherEvt
        .Then(...),
    When(EndEvt)
        .Finalize(),
    When(StartEvt)
        // Finalize current saga
        // Transition to initial state reprocessing StartMessage bound to StartEvt

1 个答案:

答案 0 :(得分:0)

您将需要最终确定当前的传奇,并发布事件(或使用Send将其发送到同一队列),这将创建一个新的传奇实例。在这种情况下,您还需要使用一个saga存储库,该存储库会正确锁定correlationId,以便您不会同时为相同的关联处理两条消息,这很可能会先找到现有实例删除。

您无法在单个消息处理程序中完成此操作,尽管考虑它,为什么需要完成操作,而不是将当前的传奇实例重置为初始状态?

此外,您可以考虑为后续的startMsg使用单独的correlationId,以便在完成过程中跟踪每个“尝试”。否则,您将不知道先前尝试的最新消息是否会混淆当前尝试的实际状态-因为您将无法区分它们。