Azure 服务总线上的 NServiceBus:无法启动订阅端点

NServiceBus on Azure Service Bus: unable to get subscribing endpoint to start

我正在尝试在 Azure 服务总线上获取一对 NSB 端点(一个事件发布者和一个事件订阅者)运行。

我已经通过 Azure 门户创建了服务总线和主题,我的发布者能够很好地将事件发布到主题。这是相关代码:

    public static async Task Main()
    {
        var endpointConfiguration = new EndpointConfiguration(EndpointName);
        endpointConfiguration.SendOnly();

        var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>();
        transport.ConnectionString(ServiceBusConnectionString);
        transport.TopicName(TopicName);

        var startableEndpoint = await Endpoint.Create(endpointConfiguration)
            .ConfigureAwait(false);

        var endpointInstance = await startableEndpoint.Start().ConfigureAwait(false);

        var message = new MyMessage {Data = Guid.NewGuid().ToString()};

        Console.WriteLine($"");
        Console.WriteLine($"----------------");
        Console.WriteLine($"Sending message ({message.Data})");
        Console.WriteLine($"----------------");
        Console.WriteLine($"");

        await endpointInstance.Publish(message);

        await endpointInstance.Stop().ConfigureAwait(false);
    }

消息 class 位于共享程序集中:

namespace NsbAsbPoc.Messages
{
    public class MyMessage : IEvent
    {
        public string Data { get; set; }
    }
}

不过我无法为此消息设置订阅者。我试过以下方法:

    public static async Task Main()
    {
        var endpointConfiguration = new EndpointConfiguration(EndpointName);

        endpointConfiguration
            .UseTransport<AzureServiceBusTransport>()
            .ConnectionString(ServiceBusConnectionString)
            .TopicName(TopicName);

        endpointConfiguration.UsePersistence<InMemoryPersistence>();

        var startableEndpoint =
            await Endpoint.Create(endpointConfiguration).ConfigureAwait(false);

        var endpointInstance = await startableEndpoint.Start().ConfigureAwait(false);

        Console.ReadLine();

        await endpointInstance.Stop().ConfigureAwait(false);
    }

    public class Handler : IHandleMessages<MyMessage>
    {
        public Task Handle(MyMessage message, IMessageHandlerContext context)
        {
            Console.WriteLine($"");
            Console.WriteLine($"----------------");
            Console.WriteLine($"Received message ({message.Data})");
            Console.WriteLine($"----------------");
            Console.WriteLine($"");

            return Task.CompletedTask;
        }
    }

但我在启动时遇到以下错误:

ERROR NServiceBus.Features.AutoSubscribe AutoSubscribe was unable 
to subscribe to event 'NsbAsbPoc.Messages.MyMessage': The messaging entity 
'xxxx:Topic:rich-test-topic|rich-test-vs-receiver-nsb|NsbAsbPoc.Messages.MyMessage' 
could not be found. TrackingId:150fa682-205a-4dc1-a2fb-af6ddf8c1b4f_B2, SystemTracker:NoSystemTracker, Timestamp:2019-07-23T14:25:16

请注意,在上面的消息中,我已经编辑了总线实例的名称。另请注意,rich-test-topic 是我的主题名称,rich-test-vs-receiver-nsb 是我的接收端点的名称。

我完全不知道如何继续,因为这个新版本的 NServiceBus.Transport.AzureServiceBus 库似乎几乎没有文档,也几乎没有示例。我不知道它在做什么;我应该手动配置订阅吗?我应该让 NSB 自己创建主题吗?端点名称有任何意义吗?

您收到的异常表明未找到具有事件规则的订阅。如果您手动创建主题并配置发布者使用它,发布者将向主题发送事件。要使订阅者正常工作,它需要找到主题(您已在两侧创建和配置),但还需要创建订阅和规则。缺少的订阅应与订阅/接收端点名称rich-test-vs-receiver-nsb 匹配,规则应与消息全名NsbAsbPoc.Messages.MyMessage 匹配。你可以找到可视化 here.

我的建议是让您的开发环境中的安装程序能够先查看 NServiceBus 创建的内容,以便您稍后可以禁用它们并编写实体创建脚本。要启用安装程序,请参阅 this 文档。