Azure Service Bus上的NServiceBus:无法启动订阅端点

时间:2019-07-23 14:30:27

标签: nservicebus azureservicebus

我正在尝试使一对NSB终结点(事件发布者和事件订阅者)在Azure Service Bus之上运行。

我已经通过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);
    }

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

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自己创建主题吗?端点名称是否有任何重要意义?

1 个答案:

答案 0 :(得分:1)

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

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