Сага 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)
        );

Это то, что я делаю не так?

0 ответов

Другие вопросы по тегам