了解MassTransit中的“Finalize”

我在理解Finalize()如何在MassTransit中工作时遇到了一些麻烦,特别是它是否可以在初始状态下执行。 建立:

public Event CrawlCreated { get; private set; } public Event CrawlFailed { get; private set; } public State Executing { get; private set; } public State Completed { get; private set; } public State Failed { get; private set; } public WorkflowSaga() { InstanceState(x => x.CurrentState); Initially( When(CrawlCreated) .Then(HandleCrawlRequestCreated) .TransitionTo(Executing), When(CrawlFailed) .Then(HandleCrawlFailed) .TransitionTo(Failed) .Finalize() ); ... SetCompletedWhenFinalized(); } 

如果我在HandleCrawlRequestCreated中捕获exception,我会引发CrawlFailed,如下所示:

 context.Raise(CrawlFailed); 

它正确触发HandleCrawlFailed,但它不会从存储库中删除状态机实例(SQL Server通过EF)。 但是如果我在执行状态期间引发CrawlFailed,则会从​​存储库中删除该实例。 我错过了什么?

您应该使用.Catch()方法,而不是在方法中捕获exception,并且在.Catch中您可以最终确定而不是转换到执行状态。

如果你在Initial中Finalize,它不应该永远保持状态机到数据库,但我没有编写EF存储库,我不确定测试覆盖率是否确保如此。