我正在将Masstransit 5.1.4与sagas一起使用。我有一个传奇,我想实现以下行为:
我该如何实现?
这是一个小的伪代码
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
答案 0 :(得分:0)
您将需要最终确定当前的传奇,并发布事件(或使用Send
将其发送到同一队列),这将创建一个新的传奇实例。在这种情况下,您还需要使用一个saga存储库,该存储库会正确锁定correlationId,以便您不会同时为相同的关联处理两条消息,这很可能会先找到现有实例删除。
您无法在单个消息处理程序中完成此操作,尽管考虑它,为什么需要完成操作,而不是将当前的传奇实例重置为初始状态?
此外,您可以考虑为后续的startMsg使用单独的correlationId,以便在完成过程中跟踪每个“尝试”。否则,您将不知道先前尝试的最新消息是否会混淆当前尝试的实际状态-因为您将无法区分它们。