我有一个 MassTransitStateMachine 来编排一个涉及创建多个事件的过程。
完成所有事件后,我希望状态转换到“清理”阶段。
下面是相关的状态声明和过滤函数:
During(ImportingData,
When(DataImported)
// When we get a data imported event, mark this source as done.
.Then(MarkImportCompletedForLocation),
When(DataImported, IsAllDataImported)
// Once all are done, we can transition to cleaning up...
.Then(CleanUpSources)
.TransitionTo(CleaningUp)
);
...snip...
private static bool IsAllDataImported(EventContext<DataImportSagaState, DataImportMappingCompletedEvent> ctx)
{
return ctx.Instance.Locations.Values.All(x => x);
}
因此,当状态为ImportingData时,我希望收到多个DataImported事件。每个事件都将其位置标记为已完成,以便IsAllDataImported方法可以确定我们是否应该转换到下一个状态。
但是,如果最后两个DataImported事件同时到达,则转换到CleaningUp阶段的处理程序会触发两次,我最终会尝试执行两次清理。
我可以用自己的代码解决这个问题,但我希望状态机能够管理这个问题。我做错了什么,还是我只需要自己处理争用?