4

我在 RabbitMQ 服务器上指定了一个名为MyQueue. 它经久耐用,并已x-dead-letter-exchange设置为MyQueue.DLX.

(我也有一个名为MyExchange绑定到该队列的交换,另一个名为的交换MyQueue.DLX,但我不认为这对这个问题很重要)

如果我使用 ruby​​ 的amqpgem 订阅这些消息,我会这样做:

# 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:guest@127.0.0.1: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'}

这似乎是说我没有指定与预先存在的队列相同的死信交换 - 但我相信我有这queue = ...条线。

有任何想法吗?

4

2 回答 2

3

DLX 信息在arguments选项中传递:

queue = channel.queue("MyQueue", {durable: true, arguments: {"x-dead-letter-exchange" => "MyQueue.DLX"}})
于 2013-11-10T21:50:02.323 回答
0

即使使用@Karl Wilbur 的选项格式,我也遇到了同样的错误。

看起来您的“MyQueue”已经存在于 RabbitMQ 服务器上(durable:true),并且它没有死信交换配置就存在。

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

如果一个名为“MyQueue”的队列已经存在,这将不会创建一个新队列。相反,它会尝试连接到现有的,但选项/参数等必须相同,否则您会收到与您遇到的错误类似的错误。

您所要做的就是删除旧代码并再次运行您的代码(根据 Karl 的建议)。

我使用 RabbitMQ 管理 GUI 来删除我的。看到这里重新删除队列

于 2016-02-25T06:19:11.243 回答