RabbitMQ死信交换永远不会得到消息

jhi*_*den 43 rabbitmq dead-letter

我正在尝试设置我的第一个RabbitMQ死信交换,这是我通过Web管理界面使用的步骤:

  1. 创建名为"dead.letter.test"的新DIRECT交换
  2. 创建新队列"dead.letter.queue"
  3. 将"dead.letter.queue"绑定到"dead.letter.test"
  4. 创建新队列"test1",将死信交换设置为"dead.letter.test"
  5. 发送消息到"test1"
  6. Nack(带有requeue = false)"test1"中的消息

我期待这些步骤应该通过"dead.letter.test"交换记录到"dead.letter.queue".这不会发生.

我可以手动将消息放入"dead.letter.test"交换中,它显示在"dead.letter.queue"中,所以我知道这很好.

当我查看管理UI时,它显示在队列"test1"上设置了DLX参数.

我哪里错了?

jhi*_*den 62

Gentilissimo Signore非常友好地在Twitter上回答我的问题.问题是,如果您的死信交换设置为DIRECT,您必须指定一个死信路由密钥.如果您只是希望所有NACKed消息进入死信桶以供以后调查(就像我一样)那么您的死信交换应设置为FANOUT.

以下是有效的更新步骤:

  1. 创建名为"dead.letter.test"的新FANOUT交换
  2. 创建新队列"dead.letter.queue"
  3. 将"dead.letter.queue"绑定到"dead.letter.test"
  4. 创建新队列"test1",将死信交换设置为"dead.letter.test"
  5. 发送消息到"test1"
  6. Nack(带有requeue = false)"test1"中的消息


Sah*_*ati 14

死信交换没有路由密钥和直接交换


按照以下步骤进行操作: -
1.创建一个名为" dead_queue " 的新队列.
2.创建一个名为' dead_exchange '的交易所,交易类型应该是'直接'.
3. 在没有路由密钥的情况下绑定' dead_queue '和' dead_exchange '.
4.创建一个名为"新的队列test_queue ",并设置其" X-死信交换 "的名称为" dead_exchange "
5.创建一个名为"交换test_exchange "和交换的类型应该是"直接"
6.绑定" test_exchange '和' test_queue '没有路由键.

最后我们将检查它.为此,在' test_exchange ' 上发布一些参数' expiration '设置为10000.在此之后,当' test_exchange ' 上发布消息时,它将转到' test_queue ',当消息在队列中过期时,它将查找DLX参数(死信交换名称)那条消息找到名称' dead_exchange '然后该消息将达到' dead_exchange '将其传递给' 死队列 '..如果你仍然有任何问题,如果我错过了解你的问题..写下你的问题我一定会看看它...谢谢..

注意:必须在' test_exchange ' 上发布消息,因为test_queue和test_exchange绑定没有路由密钥,它会正常工作但如果你在' test_queue ' 上发布消息,将使用默认的交换和路由密钥.然后在消息队列尝试到期后使用某个默认路由密钥将该死信息传递给dead_exchange,并且消息不会进入该队列.


pin*_*ain 6

如果要在死信交换上使用自定义路由密钥,则必须x-dead-letter-routing-key在声明工作队列时设置(在您的情况下test1),否则将使用默认路由密钥.在您的情况下,RabbitMQ代理检测循环并简单地丢弃被拒绝的消息.

你需要的是在队列上设置x-dead-letter-exchange=dead.letter.testx-dead-letter-routing-key=dead.letter.queue参数test1.