2016-07-27 3 views
1

В моем приложении я пытаюсь подписаться очередь «MyQueue», которая имеет привязки к нему в «Ребус» тема обмена базирование на ваши советы, используя следующий код:Подписавшись очереди RabbitMQ через Ребус 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 крупных причины, инициированное Peer, код = 404, текст = "NOT_FOUND - без очереди 'MyQueue' в виртуальном хосте '/'", ClassID = 50, methodId = 20, cause =

хотя очередь существует.

Если я удаляю .Основные (ложные, ложные, ложные) и ждут bus.Advanced.Topics.Subscribe («MyQueue»); он создаст новый MyQueue у кролика в обмене RebusDirect и начнет слушать его. Правильная строка подключения к кролику.

Где проблема? Неправильная настройка или неправильный способ подписки?

Заранее спасибо.

ответ

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)', он создаст новый MyQueue у кролика в Exchange Rebel и начнет его слушать.Все, что мне нужно, это заставить мое приложение прослушивать существующую очередь в Rabbit, которая имеет привязки в существующем обмене темами и вызывать существующие IHandleMessages. TakinosaJi

+0

То, что вы хотите достичь, довольно необычно и определенно не поддерживается (но вы знаете это :)), и я даже не что это возможно (вы также знаете это) ... что происходит, когда вы удаляете строку 'Declarations' и используете обмены Rebus' /' RebusDirect'? – mookid8000

+0

Извините, если мой вопрос кажется странным, но в моем случае крайне важно не нарушать существующую логику, а пользоваться новым асинхронным подходом ребуса. Как я упоминал, если я удаляю '.Declarations (false, false, false)', он создаст новый MyQueue у кролика в Exchange Rebel и начнет его слушать. И причина этого - RabbitMqTransport, как я видел из кода ребуса, потому что он устанавливает привязку к очереди через DIRECT-обмен. ... model.QueueBind (адрес, this._directExchangeName, address); .... '. Мой существующий обмен, где установлены ключи маршрутизации, - это тема. – TakinosaJi