2013-08-19 4 views
3

Я указал очередь на сервере RabbitMQ под названием MyQueue. Он прочный и имеет x-dead-letter-exchange установлен на MyQueue.DLX.AMQ Gem, определяющий обмен мертвой буквой

(У меня также есть обмен называется MyExchange привязан к этой очереди, а другой обмен называется MyQueue.DLX, но я не считаю, что это важно для вопроса)

Если я использую amqp камень Ruby, чтобы подписаться на те сообщения Я хотел бы сделать это следующим образом:

# Doing this before and in a new thread has to do with how my code is structured 
# shown here in case it has a bearing on the question 
Thread.new do 
    AMQP.start('amqp://guest:[email protected]:5672') 
end 

EventMachine.next_tick do 
    channel = AMQP::Channel.new(AMQP.connection) 

    queue = channel.queue("MyQueue", :durable => true, :'x-dead-letter-exchange' => "MyQueue.DLX") 

    queue.subscribe(:ack => true) do |metadata, payload| 
    p metadata 
    p payload 
    end 
end 

Если я выполнить этот код с очередями и обменами уже созданными и связанными (так как они должны быть в моем наборе вверх), то RabbitMQ проливает следующее сообщение об ошибке в своих журналах:

=ERROR REPORT==== 19-Aug-2013::14:25:53 === 
connection <0.19654.2>, channel 2 - soft error: 
{amqp_error,precondition_failed, 
     "inequivalent arg 'x-dead-letter-exchange'for queue 'MyQueue' in vhost '/': received none but current is the value 'MyQueue.DLX' of type 'longstr'", 
     'queue.declare'} 

Который, кажется, говорит, что я не указан тот же Dead Letter Обмен как уже существующей очереди - но я считаю, что я с queue = ... линии.

Любые идеи?

+1

Так успешно ли ваш код работает, если у вас нет заявленных или обменов очередей? –

+0

Если я объявляю свои очереди без обмена мертвой буквой, тогда да, это действительно работает - я думаю, что я просто не знаю, как указать DLX с рубиновым камнем. –

ответ

3

Информация DLX передается в опции arguments:

queue = channel.queue("MyQueue", {durable: true, arguments: {"x-dead-letter-exchange" => "MyQueue.DLX"}}) 
+0

Вот документация для драгоценности 'bunny' от того же автора. IIRC, он устарел в пользу «amqp' gem, но они довольно похожи. https://github.com/ruby-amqp/rubybunny.info/blob/master/articles/extensions.md#dead-letter-exchange-dlx –

0

Я имел ту же ошибку, даже если использовать формат @Karl Уилбур с для вариантов.

Похоже, что ваш «MyQueue» уже существует на сервере RabbitMQ (durable: true) и существует без конфигурации обмена мертвой буквой.

queue = channel.queue("MyQueue", :durable => true, :'x-dead-letter-exchange' => "MyQueue.DLX") 

это не создаст новую очередь, если она уже существует под именем «MyQueue». Вместо этого он попытается подключиться к существующему, но параметры/аргументы и т. Д. Должны быть одинаковыми или вы получите ошибку, как тот, который у вас есть.

Все, что вам нужно сделать, это удалить старый и снова запустить код (с предложением Карла).

Я использовал графический интерфейс управления RabbitMQ для удаления моего. см. here re deleting queues

Смежные вопросы