-
消息被消费⽅否定确认,使⽤channel.basicNack 或 channel.basicReject ,并且此时 requeue 属性被设置为 false 。
-
消息在队列的存活时间超过设置的TTL时间。
-
消息队列的消息数量已经超过最⼤队列⻓度。
那么该消息将成为“死信”。“死信” 消息会被RabbitMQ进⾏特殊处理,如果配置了死信队列信息,那么 该消息将会被丢进死信队列中,如果没有配置,则该消息将会被丢弃
为每个需要使⽤死信的业务队列配置⼀个死信交换机,这⾥同⼀个项目的死信交换机可以共⽤⼀个,然后为每个业务队列分配⼀个单独的路由key,死信队列只不过是绑定在死信交换机上的队列,死信交换 机也不是什么特殊的交换机,只不过是⽤来接受死信的交换机,所以可以为任何类型【Direct、 Fanout、Topic】
TTL:⼀条消息或者该队列中的所有消息的最⼤存活时间
如果⼀条消息设置了TTL属性或者进⼊了设置TTL属性的队列,那么这条消息如果在TTL设置的时间内 没有被消费,则会成为“死信”。如果同时配置了队列的TTL和消息的TTL,那么较⼩的那个值将会被使
⽤。
只需要消费者⼀直消费死信队列里的消息
⚡ RabbitMQ 死信队列与延时队列终极指南
结合原理、配置、代码示例和生产实践,深入解析如何利用RabbitMQ实现消息异常处理和定时任务调度。
1. 💀 死信队列(Dead Letter Queue, DLX)
▎ 核心机制
当消息满足以下条件时,会进入死信队列:
-
消费者
basic.reject
或basic.nack
且requeue=false
-
消息TTL过期
-
队列达到最大长度
▎ 配置步骤
▎ 代码实现(Java)
// 1. 声明死信交换器和队列
channel.exchangeDeclare("dlx", "direct");
channel.queueDeclare("dlq", true, false, false, null);
channel.queueBind("dlq", "dlx", "dead");
// 2. 普通队列绑定死信规则
Map<String, Object> a