重新处理新传奇中的特定公共交通消息并完成当前
Reprocess specific masstransit message in a new saga and finalize current
我正在使用带有 sagas 的 Masstransit 5.1.4。我有一个传奇,我想在其中实现以下行为:
- 收到 StartMsg 时 -> 转换到活动状态
- 处于活动状态时,处理了多个事件
- 如果在此状态下收到 StartMsg,则当前 saga 已完成并在新的 saga 实例中重新处理 StartMsg
我怎样才能做到这一点?
这是一个小伪代码
Initially(
When(StartEvt)
.Then(...)
.TransitionTo(Active)
);
During(Active,
When(OneEvt)
.Then(...),
When(AnotherEvt
.Then(...),
When(EndEvt)
.Finalize(),
When(StartEvt)
// Finalize current saga
// Transition to initial state reprocessing StartMessage bound to StartEvt
您需要完成当前的 saga,并发布一个事件(或使用 Send
将其发送到同一队列),这将创建一个新的 saga 实例。在这种情况下,您还需要使用一个 saga 存储库,它会正确地锁定 correlationId,这样您就不会同时处理两条消息以获得相同的相关性,这可能会在它之前找到现有实例已删除。
您不能在单个消息处理程序中执行此操作,但考虑一下,为什么您需要完成,而不是将当前 saga 实例重置回初始状态?
此外,您可以考虑为后续的 startMsg 使用单独的 correlationId,以便您可以在完成时跟踪每个 "attempt"。否则,您将不知道前一次尝试的延迟消息是否会混淆当前尝试的实际状态 - 因为您无法区分它们。
我正在使用带有 sagas 的 Masstransit 5.1.4。我有一个传奇,我想在其中实现以下行为:
- 收到 StartMsg 时 -> 转换到活动状态
- 处于活动状态时,处理了多个事件
- 如果在此状态下收到 StartMsg,则当前 saga 已完成并在新的 saga 实例中重新处理 StartMsg
我怎样才能做到这一点?
这是一个小伪代码
Initially(
When(StartEvt)
.Then(...)
.TransitionTo(Active)
);
During(Active,
When(OneEvt)
.Then(...),
When(AnotherEvt
.Then(...),
When(EndEvt)
.Finalize(),
When(StartEvt)
// Finalize current saga
// Transition to initial state reprocessing StartMessage bound to StartEvt
您需要完成当前的 saga,并发布一个事件(或使用 Send
将其发送到同一队列),这将创建一个新的 saga 实例。在这种情况下,您还需要使用一个 saga 存储库,它会正确地锁定 correlationId,这样您就不会同时处理两条消息以获得相同的相关性,这可能会在它之前找到现有实例已删除。
您不能在单个消息处理程序中执行此操作,但考虑一下,为什么您需要完成,而不是将当前 saga 实例重置回初始状态?
此外,您可以考虑为后续的 startMsg 使用单独的 correlationId,以便您可以在完成时跟踪每个 "attempt"。否则,您将不知道前一次尝试的延迟消息是否会混淆当前尝试的实际状态 - 因为您无法区分它们。