重启 MassTransit Saga
Restart a MassTransit Saga
在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,将发送 UpdateInitiated
事件。
MassTransit Saga 是基于该事件启动的,它会触发一系列其他事件,直到它认为自己完成并最终确定。
更新正在进行时,用户可以更改资源并请求新的更新。当为同一资源发送新的 UpdateInitiated
事件时,我试图弄清楚如何中止正在进行的 Saga 并创建一个新实例。
我正在考虑的两种方法
关联 ResourceId。所以最初的 Saga 也会得到第二个 UpdateInitiated
事件。但是后来我不知道如何重置 saga(并停止监听与之前更新相关的事件)。
使用CorrelatedBy<Guid>
(就像我现在所做的那样)。这将为新的更新事件创建一个新的 Saga。但是后来不知道怎么取消初始Saga
有没有办法在 Saga 中监听任意事件?喜欢:“监听所有 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());
在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,将发送 UpdateInitiated
事件。
MassTransit Saga 是基于该事件启动的,它会触发一系列其他事件,直到它认为自己完成并最终确定。
更新正在进行时,用户可以更改资源并请求新的更新。当为同一资源发送新的 UpdateInitiated
事件时,我试图弄清楚如何中止正在进行的 Saga 并创建一个新实例。
我正在考虑的两种方法
关联 ResourceId。所以最初的 Saga 也会得到第二个
UpdateInitiated
事件。但是后来我不知道如何重置 saga(并停止监听与之前更新相关的事件)。使用
CorrelatedBy<Guid>
(就像我现在所做的那样)。这将为新的更新事件创建一个新的 Saga。但是后来不知道怎么取消初始Saga
有没有办法在 Saga 中监听任意事件?喜欢:“监听所有 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());