masstransit - 重新启动 MassTransit Saga
问题描述
在我的应用程序中,用户可以触发特定资源的更新。发生这种情况时,将发送一个UpdateInitiated
事件。
MassTransit Saga 基于该事件启动,并触发一系列其他事件,直到它认为自己完成并最终确定。
在更新过程中,用户可以对资源进行更改并请求新的更新。我试图弄清楚如何在UpdateInitiated
为同一资源发送新事件时中止正在进行的 Saga 并创建一个新实例。
我正在考虑的两种方法
与 ResourceId 相关。所以最初的 Saga 也会得到第二个
UpdateInitiated
事件。但是后来我不知道如何重置传奇(并停止侦听与先前更新相关的事件)。使用
CorrelatedBy<Guid>
(就像我现在所做的那样)。这将为新的更新事件创建一个新的 Saga。但是后来我不知道如何取消初始 Saga。
有没有办法在 Saga 中监听任意事件?比如:“监听所有UpdatedInitiated
事件,即使它们不相关,如果有匹配 ResourceId 的事件,则取消当前 Saga”。
解决方案
我意识到可以注册与CorrelationId
. 在我的用例中,如果有一个新事件开始一个新的 saga,我想中止一个正在进行的 saga,同样的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());
推荐阅读
- phpstorm - PhpStorm 远程 Xdebug 问题
- java - 在读取新值后读取陈旧值
- python - 正态随机变量平方的概率分布 - Python 中的理论与模拟
- python - Python 项目中的文件夹交叉引用
- c - 通过 linux 用户空间 C 中的特定下一跳发送 ping
- node.js - 如何有效解决“UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON”错误?
- python - 似乎无法生成随机数
- c++ - SFML 程序因窗口标题中的非 ASCII 字符而崩溃
- python - 在我的 Mac 操作系统上下载 rasa 时出现 tensorfow 插件问题
- node.js - 节点:npm basic-ftp,异步等待在 foreach 循环中不起作用