c# - 了解 MassTransit 中的 "Finalize"

标签 c# .net 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,但不会从存储库中删除状态机实例(通过 EF 的 SQL Server)。但是,如果我在执行状态期间引发 CrawlFailed,该实例将从存储库中删除。我错过了什么?

最佳答案

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

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

关于c# - 了解 MassTransit 中的 "Finalize",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45847673/

相关文章:

c# - 对象初始值设定项和 Dispose 当属性可以抛出异常时

c# - 无法替换文本文件中的字符串

c# - 如何以编程方式更改 C# 中 ProgressTemplate 内的跨度文本?

.net - 列出<客户> 全部或全部

dependency-injection - 如何在构建依赖项时查看消息?

c# - 用于服务/使用 OData 接口(interface)的 Entity Framework 的替代方案

c# - InvalidArgument= '0' 的值对于 'SelectedIndex' 无效

c# - 如何在 .NET core 中使用 Microsoft 身份验证提取生成的 token ?

autofac - MassTransit 、 Autofac 和 2 个公交车实例

c# - RabbitMq - ConversationId 与 CorrelationId - 哪个更适合跟踪特定请求?