首页 > 解决方案 > 在 Azure ServiceBus 上使用 MassTransit 时如何在 saga 中使用指定主题

问题描述

我希望特定传奇的所有消息传递都发生在同一个主题上。

我这样设置我的传奇:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMassTransit(x =>
    {
        var machine = new MyStateMachine();
        var repository = new InMemorySagaRepository<MyState>();

        x.UsingAzureServiceBus((ctx,cfg) => {
            cfg.Host(config.ServiceBusConnectionString);

            cfg.SubscriptionEndpoint("mySub", "myTopic", e =>
            {
                e.StateMachineSaga(machine, repository);
            });
        });
    });
}

在状态机中,我这样做:

Initially(
   When(FirstEvent)
   .PublishAsync(context => context.Init<SecondMessage>(new { TestParam = "test"}))
   .TransitionTo(FirstState));

我希望将 SecondMessage 发布在主题“myTopic”上,但 MassTransit 会为此消息创建一个新主题。

标签: asp.net-coreazureservicebusmasstransit

解决方案


MassTransit 为每个消息类型创建一个主题,并将消息发布到它们相应的主题。不建议为多个消息类型分配相同的主题名称。

如果您想为 saga 使用订阅端点,则需要在每个事件的相应主题上配置 saga。默认情况下,MassTransit 会将每个 saga 事件的消息主题转发到接收端点队列。

示例拓扑如下所示:

Azure 服务总线拓扑


推荐阅读