死信队列
引言
- 死信队列,英文缩写:DLX 。Dead Letter Exchange(死信交换机),其实应该叫做死信交换机才更恰当。
当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
![](https://img-blog.csdnimg.cn/20210525135921822.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rhbm5pbmcxMTYyNw==,size_16,color_FFFFFF,t_70)
- 总结:其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理的。但是你可以配置某个交换机为此队列的死信交换机,该队列的消息成为死信后会被重新发送到此 DLX 。至于怎么处理这个DLX中的死信就是看具体的业务场景了,DLX 中的信息可以被路由到新的队列。
消息成为死信的三种情况
- 队列长度到达限制,无法加入新的消息
- 消费者拒接消费消息,并且不重回队列。该信息会被清除并进入死信队列
- 原队列存在消息过期设置,消息到达超时时间未被消费
队列如何绑定 DLX
设置两个参数
- x-dead-letter-exchange 指定此队列的死信队列
- x-dead-letter-exchange 指定此队列向DLX发送死信的routing key,因为这个时候该队列相当于一个生产者,发送消息要指定routing key
- 实现效果:往一个普通队列添加消息,消息过期成为死信,进入死信队列。死信队列根据配置好的route key 路由到与它绑定的其他普通队列。
- 1.声明死信队列(普通交换机)
@Bean("deadExchange")
public Exchange deadExchange(){
return ExchangeBuilder.topicExchange("sb_dead_exchange"