重新处理新传奇中的特定公共交通消息并完成当前

Reprocess specific masstransit message in a new saga and finalize current

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

我怎样才能做到这一点?

这是一个小伪代码

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

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

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

此外,您可以考虑为后续的 startMsg 使用单独的 correlationId,以便您可以在完成时跟踪每个 "attempt"。否则,您将不知道前一次尝试的延迟消息是否会混淆当前尝试的实际状态 - 因为您无法区分它们。