У меня есть 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 срабатывает дважды, и я дважды пытаюсь выполнить очистку. .
Я мог решить эту проблему в собственном коде, но ожидал, что конечный автомат справится с этим. Я что-то делаю не так, или мне просто нужно разобраться с разногласиями самостоятельно?