我在理解 Finalize() 在 MassTransit 中的工作原理时遇到了一些问题,特别是它是否可以在初始状态下执行。设置:
public Event<ICrawlRequestCreated> 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 中捕获异常,我会引发 CrawlFailed,如下所示:
context.Raise(CrawlFailed);
它会正确触发 HandleCrawlFailed,但不会从存储库中删除状态机实例(通过 EF 的 SQL Server)。但是,如果我在执行状态期间引发 CrawlFailed,该实例将从存储库中删除。我错过了什么?
最佳答案
您应该使用 .Catch() 方法,而不是在您的方法中捕获异常,并且在 .Catch 中您可以完成而不是转换到执行状态。
如果您在 Initial 中完成,它不应该将状态机持久保存到数据库中,但我没有编写 EF 存储库,我不确定测试覆盖率是否确保了这种情况。
关于c# - 了解 MassTransit 中的 "Finalize",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45847673/