如何解决重新启动大众运输传奇
在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,会发送一个 UpdateInitiated
事件。
根据该事件启动 MassTransit Saga,并触发一系列其他事件,直到它认为自己已完成并完成。
更新正在进行时,用户可以对资源进行更改并请求新的更新。我试图弄清楚如何在为同一资源发送新的 UpdateInitiated
事件时中止正在进行的 Saga 并创建一个新实例。
我正在考虑的两种方法
-
与 ResourceId 相关联。所以最初的 Saga 也会得到第二个
UpdateInitiated
事件。但后来我不知道如何重置传奇(并停止侦听与上一次更新相关的事件)。 -
使用
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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。