2016-07-27 90 views
1

RabbitMQ的队列在我的应用我想订阅“myQueue中”队列具有绑定到它在使用下面的代码的建议“卤面”的话题交换筑底:订阅通过卤面2

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近距离原因,通过 位体,代码= 404发起的,文本= “NOT_FOUND - 在虚拟主机没有队列 'myQueue中' '/'”, CLASSID = 50,methodId = 20,原因=

尽管队列存在。

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

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

在此先感谢。

回答

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

+1

也许我没有理解你的观点,但如果我不想存档非凡的东西。我一直在使用Rebus 1,现在切换到2版本。我的目标是继续应用程序中已存在的消息传递方式。如果我删除'.Declarations(false,false,false)',它将在RebusDirect交换中创建新的MyQueue,并开始监听它。我需要的是让我的应用程序监听Rabbit中的现有队列,该队列在已有的主题交换中绑定并调用现有的IHandleMessages TakinosaJi

+0

你想实现的是非常非凡的,绝对不支持(但你知道:)),我甚至不肯定它是可能的(你也知道)......当你删除'Declarations'行并使用'Rebus' /'RebusDirect'交换时会发生什么? – mookid8000

+0

对不起,如果我的问题看起来很奇怪,但在我的情况下,不要打破现有的逻辑,但享受新的rebus异步方法是非常重要的。正如我所提到的,如果我删除'.Declarations(false,false,false)',它将在RebusDirect交换中创建新的MyQueue,并开始监听它。它的原因是RabbitMqTransport,因为我已经从rebus代码中看到它,因为它通过DIRECT交换建立了绑定到一个队列'.... model.QueueBind(address,this._directExchangeName,address); ....'。我设置路由键的现有交换是主题。 – TakinosaJi