如何指定要与 MassTransit 一起使用的 Azure 服务总线主题

Ori*_*ter 4 c# masstransit azureservicebus azure-servicebus-topics

我尝试使用 MassTransit 将消息发布到eventsAzure 服务总线中命名的主题。我在配置 MassTransit 以使用我预定义的主题时遇到问题events,而是为消息类型创建了一个由命名空间/类名命名的新主题。所以我想知道如何指定使用哪个主题而不是创建一个新主题。

这是我测试过的代码:

using System;
using System.Threading.Tasks;
using MassTransit;
using MassTransit.AzureServiceBusTransport;
using Microsoft.ServiceBus;

namespace PublisherNameSpace
{
    public class Publisher
    {
        public static async Task PublishMessage()
        {
            var topic = "events";
            var bus = Bus.Factory.CreateUsingAzureServiceBus(
                cfg =>
                {
                    var azureServiceBusHost = cfg.Host(new Uri("sb://<busname>.servicebus.windows.net"), host =>
                    {
                        host.OperationTimeout = TimeSpan.FromSeconds(5);
                        host.TokenProvider =
                            TokenProvider.CreateSharedAccessSignatureTokenProvider(
                                "RootManageSharedAccessKey",
                                "<key>"
                            );
                    });

                    cfg.ReceiveEndpoint(azureServiceBusHost, topic, e =>
                    {
                        e.Consumer<TestConsumer>();
                    });
                });

            await bus.Publish<TestConsumer>(new TestMessage { TestString = "testing" });
        }
    }

    public class TestConsumer : IConsumer<TestMessage>
    {
        public Task Consume(ConsumeContext<TestMessage> context)
        {
            return Console.Out.WriteAsync("Consuming message");
        }
    }

    public class TestMessage
    {
        public string TestString { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ess 10

接受的答案清除了订阅方:

cfg.SubscriptionEndpoint(
    host,
    "sub-1",
    "my-topic-1",
    e =>
    {
        e.ConfigureConsumer<TestConsumer>(provider);
    });
Run Code Online (Sandbox Code Playgroud)

对于那些想知道如何在发布端正确获取总线配置的人,它应该如下所示:

cfg.Message<TestMessage>(x =>
{
    x.SetEntityName("my-topic-1");
});
Run Code Online (Sandbox Code Playgroud)

然后你可以在总线上调用发布:

await bus.Publish<TestMessage>(message);
Run Code Online (Sandbox Code Playgroud)

感谢@ChrisPatterson向我指出这一点

  • 我不知道为什么官方文档没有这么清楚。我觉得很难理解。 (6认同)

Chr*_*son 4

如果您想从特定主题消费,请创建订阅端点而不是接收端点,并在配置中指定主题和订阅名称。

最简单的形式如单元测试所示:

https://github.com/MassTransit/MassTransit/blob/develop/tests/MassTransit.Azure.ServiceBus.Core.Tests/Subscription_Specs.cs