通过Rebus 2订阅rabbitmq队列

时间:2016-07-27 12:31:08

标签: rabbitmq rebus

在我的应用程序中,我正在尝试使用下一个代码订阅“MyQueue”队列,该队列在“Rebus”主题交换中绑定了它:

    async void InitializeBus()
    {

    var busConfigurer = Configure.With(new CastleWindsorContainerAdapter(_container))
            .Logging(l => l.Log4Net())
            .Transport(t => t.UseRabbitMq(_connectionString, "MyQueue")
                .Declarations(false, false, false)
                    .ExchangeNames("RebusDirect", "Rebus")
                        .Prefetch(5))
            .Options(o => {
                o.SimpleRetryStrategy(_errorQueue);
                if (_enableLegacyCompatibility)
                {
                    o.EnableLegacyCompatibility();
                }
            })
            .Serialization(s => s.Decorate(c => new XmlMessageSerializer()));

        var bus = busConfigurer.Start();`
        await bus.Advanced.Topics.Subscribe("MyQueue");
    }

因此我有一个例外

  

AMQP操作被中断:AMQP关闭原因,由...发起   Peer,code = 404,text =“NOT_FOUND - vhost'/'中没有队列'MyQueue',   classId = 50,methodId = 20,cause =

虽然队列存在。

如果我删除.Declarations(false,false,false)并等待bus.Advanced.Topics.Subscribe(“MyQueue”);它将在RebusDirect交换中用兔子创建新的MyQueue并开始收听它。兔子的连接字符串是正确的。

问题出在哪里?配置不当或订阅方式不正确?

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先 - 如果你是专家Rebus和RabbitMQ用户,你应该只跳过自动声明的东西,并且你想要实现一些与众不同的东西。

Declarations部分应该是.Declarations(true, true, true)(或者只是省略,因为默认情况下总是确保自动声明交换,队列和绑定)。

接下来的事情 - 行

await bus.Advanced.Topics.Subscribe("MyQueue");

表示您感到困惑,因为MyQueue是一个队列,但当您Subscribe某事时,您订阅了一个主题。

“主题”基本上只是一个任意字符串,例如“thingamabob”。发布者可以使用该主题发布内容,如下所示:

await bus.Advanced.Topics.Publish("thingamabob", new GizmoDoodle());

然后GizmoDoodle消息传递给当前绑定到该主题的队列

为了“绑定主题”,你

await bus.Advanced.Topics.Subscribe("thingamabob");

在RabbitMQ中建立绑定。

我建议你从一个干净的平板开始(不用任何方式定制Rebus对RabbitMQ的使用),然后去看看Rebus在RabbitMQ中创建的内容以使它工作。如果你还没有这样做,你肯定应该启用RabbitMQ Management Plugin