重启MassTransit传奇



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

MassTransit传奇是基于该事件启动的,它会触发一系列其他事件,直到它认为自己完成并结束。

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

我在考虑的两种方法

  1. 在ResourceId上进行关联。因此,最初的佐贺也将获得第二个UpdateInitiated事件。但我不知道如何重置传奇故事(并停止收听与上次更新相关的事件(。

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

有没有一种方法可以监听传奇中的任意事件?比如:";监听所有UpdatedInitiated事件,即使它们不相关,如果存在具有匹配ResourceId的事件,则取消当前Saga;。

我意识到可以注册与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());

相关内容

  • 没有找到相关文章

最新更新