在要共享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可用。