延迟队列: 进入队列的消息会被延迟消费的队列
场景: 超时订单、限时优惠、定时发布
❒ 死信交换机
✔ 当一个队列中的消息满足下列情况之一时,可以成为死信(dead letter)
✔ 消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false
✔ 消息是一个过期消息,超时无人消费
✔ 要投递的队列消息堆积满了,最早的消息可能成为死信
❒ TTL
✔ TTL,也就是Time-To-Live。如果一个队列中的消息TTL结束仍未消费,则会变为死信,ttl超时分为两种情况
✔ 消息所在的队列设置了存活时间 (x-message-ttl=10000)
✔ 消息本身设置了存活时间 (ttl= 5000)
// 创建消息
Message message = MessageBuilder
.withBody("hello, ttl message".getBytes(standardcharsets.UTF-8))
.setExpiration("5000")
.build();
// 消息ID,需要封装到correlationData中
CorrelationData correlationData = new CorrelationData(UuID.randomuUID().tostring());
// 发送消息
rabbitTemplate.convertAndsend("ttl.direct","ttl", message, correlationData);
❒ 延迟队列插件
DelayExchange插件,需要安装在RabbitMQ中
RabbitMQ有一个官方的插件社区,地址为:https://www,rabbitmg.com/community=plugins.html
// 创建消息
Message message =M essageBuilder
.withBody("hello, delayed message".getBytes(standardcharsets.uTF_8))
.setHeader("x-delay",10000)
.build();
// 消息ID,需要封装到correlationData中
CorrelationData correlationData = new CorrelationData(uuID,randomuuID().tostring());
// 发送消息
rabbitTemplate,convertAndSend("delay.direct", "delay", message, correlationData);