【问题标题】:Restart a MassTransit Saga重新启动 MassTransit Saga
【发布时间】:2021-05-06 06:31:30
【问题描述】:

在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,将发送 UpdateInitiated 事件。

MassTransit Saga 基于该事件启动,并触发一系列其他事件,直到它认为自己已完成并最终确定。

当更新正在进行时,用户可以对资源进行更改并请求新的更新。我试图弄清楚如何在为同一资源发送新的UpdateInitiated 事件时中止正在进行的 Saga 并创建一个新实例。

我正在考虑的两种方法

  1. 与 ResourceId 相关。所以最初的 Saga 也会得到第二个 UpdateInitiated 事件。但后来我不知道如何重置传奇(并停止侦听与先前更新相关的事件)。

  2. 使用CorrelatedBy<Guid>(就像我现在所做的那样)。这将为新的更新事件创建一个新的 Saga。但后来我不知道如何取消初始 Saga。

有没有办法监听 Saga 中的任意事件?比如:“监听所有 UpdatedInitiated 事件,即使它们不相关,如果有匹配 ResourceId 的事件,则取消当前 Saga”。

【问题讨论】:

    标签: masstransit automatonymous


    【解决方案1】:

    我意识到可以注册与CorrelationId 以外的其他内容相关的事件。在我的用例中,如果有一个新事件开始一个新的传奇,我想中止一个正在进行的传奇,同样ResourceId

    我做的是这样的:

    // Listen to update initiated events for the same ResourceId
    Event(() => UpdateInitiated , e => e
        .CorrelateBy((instance, context) =>
            instance.CurrentState != 2 &&
            instance.CorrelationId != context.Message.CorrelationId &&
            instance.ResourceId == context.Message.ResourceId
        )
        .SelectId(x => NewId.NextGuid()));
    
    // Finalize this saga if there is a newer one for the same ResourceId
    DuringAny(
        When(UpdateInitiated)
            .Then(context => Log.Information("Saga aborted due to newer update initiated by {correlationId}", context.Data.CorrelationId))
            .Finalize());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多