延迟消息

97 阅读1分钟

一、死信交换机

当一个队列中的消息满足下列情况之一时,就会成为死信(dead letter):

  • 消费者使用basic.rejectbasic.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说明安装成功

image.png

生产者

@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);
}