日积月累,水滴石穿 😄
什么是死信队列
DLX ,全称为 Dead-Letter-Exchange
,可以称之为死信交换机。当消息在一个队列中变成死信( dead message )之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX ,绑定 DLX 的队列就称之为死信队列。
消息变成死信一般是由于以下几种情况造成的:
-
1、消息过期,也就是笔者在上篇提到的 TTL。消息在队列的存活时间超过所设置的 TTL 时间。
-
2、消息被拒绝,调用了
channel.basicNack
或channel.basicReject
方法,井且设置requeue
参数为false
。 -
3、队列的消息达到最大长度。
DLX 也是一个正常的交换器,和一般的交换器没有区别,它能在任何的队列上被指定,实际上就是设置某个队列的属性。当这个队列中存在死信时 RabbitMQ
就会自动地将这个消息新发布到设置的 DLX 上去,进而被路由到另一个队列,即死信队列。可以监听这个队列中的消息、以进行相应的处理。
配置死信队列
在 channel.queueDeclare
方法中设置 x-dead-letter-exchange
参数来为这个队列添加 DLX。下面就第一种和第二种情况来介绍一下死信队列的配置与使用。
消息过期
添加配置
mq:
queueBinding:
queue: prod_queue_pay
dlQueue: dl-queue
exchange:
name: exchang_prod_pay
dlTopicExchange: dl-topic-exchange
key: prod_pay
dlRoutingKey: dl-routing-key
创建死信交换机、死信队列以及两者的绑定
@Value("${mq.queueBinding.exchange.dlTopicExchange}")
private String dlTopicExchange;
@Value("${mq.queueBinding.dlRoutingKey}")
private String dlRoutingKey;
@Value("${mq.queueBinding.dlQueue}")
private String dlQueue;
//创建死信交换机
@Bean
public TopicExchange dlTopicExchange(){