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上去,进而被路由到另一个队列。
可以监听这个队列中的消息做相应的处理。
首先需要设置死信队列的exchange和queue,然后进行绑定:
Exchange: dlx.exchange Queue: dlx.queue RoutingKey: # #表示只要有消息到达了Exchange,那么都会路由到这个queue上
然后需要有一个监听,去监听这个队列进行处理
然后我们进行正常声明交换机、队列、绑定,只不过我们需要在队列加上一个参数即可:arguments.put(" x-dead-letter-exchange","dlx.exchange");
,这样消息在过期、requeue、 队列在达到最大长度时,消息就可以直接路由到死信队列!