RabbitMq 消息队列笔记 > AMPQ 基础概念说明
死信队列

消息变成死信无非是以下几种情况:

1. 消息被拒绝签收(basic.reject / basic.nack),并且不允许重回队列(requeue = false)。

2. TTL设定的消息有效时间过期。

3. 实际消息数大于队列最大限制数,那么超出最大限制的消息都将会是死信。

那么,出现了死信,应该如何处理呢?

其实,我们可以把这些死信放到自定义的死信队列里去。

什么叫做死信队列?

“死信队列”,顾名思义,就是存放死信的队列。其实它和普通的队列并没有太大差别,唯一的区别就是他的routingkey是"#"。也就是说:只要你路由到我这个死信队列,我都接收。


  • 死信队列:DLX,dead-letter-exchange

  • 利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange,这个Exchange就是DLX

消息变成死信有以下几种情况
  • 消息被拒绝(basic.reject / basic.nack),并且requeue = false

  • 消息TTL过期

  • 队列达到最大长度

死信处理过程
  • DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。

  • 当这个队列中有死信时,RabbitMQ就会自动的将这个消息重新发布到设置的Exchange上去,进而被路由到另一个队列。

  • 可以监听这个队列中的消息做相应的处理。

死信队列设置
  1. 首先需要设置死信队列的exchange和queue,然后进行绑定:

Exchange: dlx.exchange
Queue: dlx.queue
RoutingKey: #
#表示只要有消息到达了Exchange,那么都会路由到这个queue上
  1. 然后需要有一个监听,去监听这个队列进行处理

  2. 然后我们进行正常声明交换机、队列、绑定,只不过我们需要在队列加上一个参数即可:arguments.put(" x-dead-letter-exchange","dlx.exchange");,这样消息在过期、requeue、 队列在达到最大长度时,消息就可以直接路由到死信队列!