Сага MassTransit получает неожиданные события
Я использую MassTransit.Automatonymous (версия 3.3.5) для управления сагой, и я, кажется, получаю неожиданные события после перехода состояния.
Вот мое состояние:
Initially(
When(Requested)
.ThenAsync(InitialiseSaga)
.TransitionTo(Initialising)
);
During(Initialising,
When(InitialisationCompleted)
.ThenAsync(FetchTraceSetMetaData)
.TransitionTo(FetchingTraceSetMetaData)
);
During(FetchingTraceSetMetaData,
When(TraceSetMetaDataRetrieved)
.ThenAsync(ExtractTiffFiles)
.TransitionTo(ExtractingTiffFiles)
);
During(ExtractingTiffFiles,
When(TiffFilesExtracted)
.ThenAsync(DispatchTiffParseMessages)
.TransitionTo(DispatchingTiffParseMessages)
);
Ошибка, которую я иногда получаю:
Событие TraceSetMetaDataRetrieved не обрабатывается во время состояния ExtractingTiffFiles для конечного автомата ImportTraceSetDataStateMachine
Мое понимание того, как это должно работать в точке ошибки, заключается в следующем:
Во время состояния FetchingTraceSetMetaData в какой-то момент я получу событие TraceSetMetaDataRetrieved. Когда это происходит, запустите метод ExtractTiffFiles и перейдите в состояние ExtractingTiffFiles.
Находясь в состоянии ExtractingTiffFiles, я не ожидал бы событие TraceSetMetaDataRetrieved, поскольку именно оно привело нас в состояние ExtractingTiffFiles.
Ниже приведены два метода FetchTraceSetMetaData и ExtractTiffFiles (для краткости сокращены):
public async Task FetchTraceSetMetaData(BehaviorContext<ImportTraceSetDataSagaState, InitialisationCompleteEvent> context)
{
var traceSetId = context.Instance.TraceSetId;
_log.Information($"Getting pixel indicies for trace set with id {traceSetId}");
// Snip...!
await context.Publish(new TraceSetMetaDataRetrievedEvent { CorrelationId = context.Data.CorrelationId });
}
public async Task ExtractTiffFiles(BehaviorContext<ImportTraceSetDataSagaState, TraceSetMetaDataRetrievedEvent> context)
{
_log.Information($"Extracting tiffs for {context.Instance.TiffZipFileKey} and trace set with id {context.Instance.TraceSetId}");
// Snip...!
// Dispatch an event to put the saga in the next state where we dispatch the parse messages
await context.Publish(new TiffFilesExtractedEvent { CorrelationId = context.Data.CorrelationId });
}
Размещать пост обдумывать
Мне просто пришло в голову, что, возможно, я должен иметь свои заявления TransitionTo перед моими заявлениями ThenAsync. например
During(FetchingTraceSetMetaData,
When(TraceSetMetaDataRetrieved)
.TransitionTo(ExtractingTiffFiles)
.ThenAsync(ExtractTiffFiles)
);
Это то, что я делаю не так?