一、死信交换机
当一个队列中的消息满足下列情况之一时,就会成为死信(dead letter):
- 消费者使用
basic.reject或basic.nack声明消费失败,并且消息的requeue参数设置为false - 消息是一个过期消息(达到了队列或消息本身设置的过期时间),超时无人消费
- 要投递的队列消息堆积满了,最早的消息可能成为死信
如果队列通过dead-letter-exchange属性指定了一个交换机,那么该队列中的死信就会投递到这个交换机中。这个交换机称为死信交换机(DeadLetterExchange,简称DLX)
死信交换机实现 这个不推荐,建议使用延迟消息
二、延迟消息
安装插件 链接:pan.baidu.com/s/1C8lCqq6r… 提取码:k8oh
这里只提供docker安装
# 拷贝到容器
docker cp rabbitmq_delayed_message_exchange-3.12.0.ez 容器id:/plugins
# 进入容器
docker exec -it 容器id /bin/bash
# 查看插件
rabbitmq-plugins list
# 启用插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 重启
docker restart 容器id
之后登陆控制台交换机类型有x-delayed-message说明安装成功
生产者
@GetMapping("/delayed")
public String delayed(String msg) throws InterruptedException {
String exchange = "delayed.exchange";
rabbitTemplate.convertAndSend(exchange,"delayed",msg,message -> {
message.getMessageProperties().setDelay(10000);
return message;
});
return "success";
}
消费者
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "delayed.queue",durable = "true"),
exchange = @Exchange(name = "delayed.exchange", delayed = "true"),
key = {"delayed"}
))
public void delayed(String message) {
System.out.println("delayed 收到消息:"+message);
}