RabbitMQ,死信交换 - >无法将消息路由到默认交换机?

时间:2013-01-03 15:31:39

标签: rabbitmq amqp dead-letter

使用RabbitMQ Admin(v3),我尝试创建一个队列,将死信函发送到默认交换机,路由键“MyErrorRoutingKey”上绑定了一个错误队列。 所以在管理界面中,我把“死信交换”留空了。

我只是想知道在尝试创建队列时是否正常以下消息:

  

406 PRECONDITION_FAILED - 无效的arg'x-dead-letter-routing-key'for   在vhost'/'中队列'MyQueue':routing_key_but_no_dlx_defined

似乎可以将死信消息路由到默认交换,因为在文档中进一步说:

  

可以形成死信队列的循环。例如,   当队列将消息写入默认消息时,可能会发生这种情况   交换而不指定死信路由密钥。消息   这样的周期(即两次到达同一队列的消息)将是   丢弃。

那么我应该如何将消息路由到默认交换机?与上面描述的“循环无用的死信”不同,我希望能够指定路由密钥,以便我的消息不会丢失。

2 个答案:

答案 0 :(得分:4)

听起来像routing_key_but_no_dlx_defined,如果你没有定义一个死信交换,你不应该定义一个死信 - 路由密钥,这也是有道理的。

我不确定你要对默认交换做什么,但是也有一个名字所以也许你也可以设置死信交换...

关于你对文档的最后引用,这意味着如果你使用死信交换设置一个循环,即:

QUEUE-A > DEAD-LETTER-QUEUE > QUEUE-A

...如果由于超时而离开DEAD-LETTER-QUEUE,RabbitMQ会在消息返回QUEUE-A时删除该消息。 如果这样的延迟重试是您想要的,您将不得不手动将消息排队到DEAD-LETTER-QUEUE当前,但有迹象表明RabbitMQ可能会让您稍后有这样的周期(http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-April/026489.html)。 / p>

答案 1 :(得分:2)

老问题,但似乎没有人回答,所以我会试一试。

我在使用网络用户界面遇到完全相同的错误时遇到了麻烦,但我可以通过手动设置“x-dead-letter-exchange”和“x-dead-letter-routing-key”来绕过它自定义参数,而不是使用提供的字段。

enter image description here