我正在使用 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)
);
那是我做错了吗?