使用Azure Service Bus处理Rebus中的发布/订阅

时间:2017-09-18 12:07:35

标签: rebus

我正在研究Rebus并将其与Azure Service Bus一起使用。使用它与regalure队列很容易,但是当我想使用Topic时,我无法让它工作。

这里有没有完成设置并使用主题/订阅。这是我到目前为止所做的。

        static void Main(string[] args)
    {
        _bus1 = InitializeBus(System.Environment.MachineName);
        _bus2 = InitializeBus(System.Environment.MachineName + "_2");
        _bus3 = InitializeBus();

        Run();
        Console.WriteLine("Press Enter to exit!");
        Console.ReadLine();
    }

    private static void Run()
    {
        try
        {
            _bus1.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; });
            _bus2.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; });
            _bus1.Bus.Subscribe<string>();
            _bus2.Bus.Subscribe<string>();
            _bus3.Bus.Publish("Publish test message");
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    private static BuiltinHandlerActivator InitializeBus(string queueName = null)
    {
        var activator = new BuiltinHandlerActivator();

        if(string.IsNullOrEmpty(queueName))
            Configure.With(activator)
                .Transport(t => t.UseAzureServiceBusAsOneWayClient(connectionString))
                .Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); })
                .Start();
        else
            Configure.With(activator)
                .Transport(t => t.UseAzureServiceBus(connectionString, queueName).EnablePartitioning().DoNotCreateQueues())
                .Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); })
                .Start();

        return activator;
    }

首先我创造了所有的公共汽车。我正在使用DontCreateQueues(),因为我不希望在我的根目录中创建重复的队列,但仅在主题下作为订阅。 然后我设置了总线并且发布工作正常,创建了一个Topic并在此主题下创建了2个订阅,并且每个订阅中都有1条消息。但这些消息从未收集过。

如果我在配置中删除DontCreateQueues()方法代码工作,但是在根目录中创建了2个队列,主题是2个订阅,但我不能这样。

最诚挚的问候 马格努斯

1 个答案:

答案 0 :(得分:0)

Rebus通过为您订阅的每个主题创建订阅来使用主题,然后配置订阅以将收到的消息转发到总线的输入队列。

如果总线没有带有预期名称的输入队列(由Rebus创建的一个,或者您手动创建的一个),则无法正常工作。

DontCreateQueues()存在的原因是允许专家用户配置他们的队列设置超出Rebus能够(并且愿意)做的事情。它需要非常详细的知识,了解Rebus如何预期你的队列实体,所以我建议几乎任何人都不要手动创建任何东西,然后简单地让Rebus设置。