4

我正在使用 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)
            );

有时收到的错误是:

在 ImportTraceSetDataStateMachine 状态机的 ExtractingTiffFiles 状态期间未处理 TraceSetMetaDataRetrieved 事件

我对发生错误时应该如何工作的理解如下:

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 });
    }

发帖思考

我突然想到,也许我应该在我的 ThenAsync 语句之前有我的 TransitionTo 语句。例如

During(FetchingTraceSetMetaData,
        When(TraceSetMetaDataRetrieved)
            .TransitionTo(ExtractingTiffFiles)
            .ThenAsync(ExtractTiffFiles)
        );

那是我做错了吗?

4

0 回答 0