使用MassTransit发布和订阅显式服务总线主题的正确方法是什么?

时间:2019-08-21 14:24:38

标签: c# azureservicebus masstransit

在要共享Azure Service Bus命名空间(以节省成本等)的情况下,能够显式设置队列和主题名称而不是依赖MassTransit约定会很有帮助。尽管使用队列很简单,但是我们遇到了主题难题。

MassTransit documentation在此区域稀疏。

当前建议使用ReceiveEndpoint,它似乎将消息从主题订阅转发到队列,然后订阅该队列。我们已经完成了此设置,但是当我们直接订阅该主题时似乎很浪费?

cfg.ReceiveEndpoint(
    host, 
    "my-queue-1",
    e =>
    {
        e.Subscribe("my-topic-1", "sub-1");
        e.ConfigureConsumer<MyConsumer>(provider);
        e.MaxConcurrentCalls = 24;
    });

我发现SubscriptionEndpoint似乎就是这样做的。我们想使用命名订阅“ sub-1”来订阅专门命名的主题“ my-topic-1”。我们可以将ReceiveEndpoint替换为SubscriptionEndpoint,如下所示:

cfg.SubscriptionEndpoint(
    host,
    "sub-1",
    "my-topic-1",
    e =>
    {
        e.ConfigureConsumer<MyConsumer>(provider);
        e.MaxConcurrentCalls = 24;
    });

我们希望发布者位于单独的应用程序中,其总线配置和发布代码应该是什么样?文档提示Publish Topology可用于提供明确的服务总线主题名称。我们尝试如下设置TopicDescription.Path

Bus.Factory.CreateUsingAzureServiceBus(..., cfg =>
{
    cfg.Publish<IMyMessage>(x =>
    {
        x.TopicDescription.Path = "my-topic-1";
    });
});
await bus.Publish<IMyMessage>(message);

但是消息并没有传达给消费者。

似乎这是发布问题。尽管发布者创建了主题“ my-topic-1”,但仍将消息发布到主题“ my.namespace / imymessage”。查看ServiceBusMessagePublishTopology的源代码,我可以看到为什么是这种情况(_topicDescription与_topicConfigurator),但是如何用硬编码到messageTopology的EntityName({{3} }),然后只有BasePath上的setter可用。

0 个答案:

没有答案