官方关于死信队列的介绍
Dead Letter Exchanges | RabbitMQhttps://www.rabbitmq.com/docs/dlx
前言:
在RabbitMQ中,如果在声明队列时不指定TTL(Time-To-Live,存活时间),但在发布消息时指定了TTL,则会使用消息的TTL。当消息过期时,它不会自动进入死信(Dead Letter)队列,除非你专门设置了死信交换器(Dead Letter Exchange,DLX)。
为了让过期的消息进入死信队列,你需要做以下几步:
-
声明一个死信交换机(my-dlx)
-
声明一个死信队列(dead-queue),并在声明完成后,绑定死信交换机(my-dlx)和死信routing-key(比如我定义叫dlx.ttl.key)
-
声明一个普通队列(normal-queue),声明时要指定两个参数
-
x-dead-letter-exchange:指定你刚刚声明的死信交换机(my-dlx)
-
x-dead-letter-routing-key:指定你刚刚自定义的routing-key(dlx.ttl.key)
-
-
发送消息的时候,设置消息的TTL。
看图说话
1. 声明一个死信交换机,如下图
2. 声明一个死信队列,如下图
3. 声明一个普通队列,并设置参数(x-dead-letter-exchange,x-dead-letter-routing-key),如下图
4. 为死信队列绑定绑定死信交换机(mgcc-dlx)和死信routing-key(比如我定义叫dlx.ttl.key)
贴一段发消息的代码
/**
* 发送带TTL的数据至优先级队列
*
* @param routingKey 队列名称
* @param message 消息
* @param priority 优先级 1-10
*/
public void mgccSendTtlPriorityQueue(String routingKey, Object message, int priority, String expiration) {
log.info("发送消息【{}】至优先级队列【{}】,优先级为:{},有效期为:{}", message, routingKey, priority, expiration);
mgccRabbitTemplate.convertAndSend(routingKey, message, messageProperties -> {
messageProperties.getMessageProperties().setPriority(priority);
messageProperties.getMessageProperties().setExpiration(expiration);
return messageProperties;
});
}
@Test
public void test() {
Long millisecondDiff = 5000L;
producerService.mgccSendTtlPriorityQueue("mgcc_test", "asd",
1, millisecondDiff.toString());
}
看看效果
1. 向普通队列(mgcc_test)发消息,消息正常进入,显示待消费数量:1
2. 普通队列(mgcc_test)消息过期后,消息流入死信队列(test_dead),显示待消费数量:1
大功告成!
吐槽一下
CSDN的编辑真是越来越难用了,这些图片贴的歪歪扭扭,对于强迫症来说是真难受啊