0

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

  • 当收到 StartMsg 时 -> 转换到 Active 状态
  • 处于活动状态时,会处理几个事件
  • 如果在此状态下接收到 StartMsg,则当前 saga 已完成并在新的 saga 实例中重新处理 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
4

1 回答 1

0

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

您不能在单个消息处理程序中执行此操作,但考虑一下,为什么需要完成,而不是将当前 saga 实例重置回初始状态?

此外,您可能会考虑为后续的 startMsg 使用单独的相关 ID,以便您可以跟踪完成时的每个“尝试”。否则,您将不知道来自先前尝试的延迟消息是否会混淆当前尝试的实际状态 - 因为您无法区分它们。

于 2019-07-09T13:34:00.070 回答