了解 MassTransit 中的 "Finalize"

Understanding "Finalize" in MassTransit

我无法理解 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,但不会从存储库中删除状态机实例(SQL 服务器通过 EF)。但是,如果我在执行状态期间引发 CrawlFailed,该实例将从存储库中删除。我错过了什么?

您应该使用 .Catch() 方法,而不是在您的方法中捕获异常,并且在 .Catch 中您可以完成而不是转换到执行状态。

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