RabbitMQ-延时队列

实现延时队列逻辑

RabbitMQ是没有直接实现延时队列的,可以使用死信队列或者是插件的形式实现延时队列。

本次质演示使用死信队列实现延时队列。

思想:生产者正常往RabbitMQ的正常队列中发送消息。不过这里给队列设置了TTL(消息在此队列的存活时间)。超过TTL后,消息则会进入死信队列。然后由监听死信队列的消费者消费此条消息。以此实现消息的延时。

RabbitMQConfig

队列以及交换机的配置文件

java 复制代码
    //正常队列,消息只存在10秒,如果没有人消费,则进入死信队列,做延时消费
    @Bean("normalQueue")
    public Queue normalQueue() {
        return QueueBuilder.durable(Constants.NORMAL_QUEUE).ttl(10000).deadLetterExchange(Constants.DL_EXCHANGE).deadLetterRoutingKey("dl").build();
    }

    //正常消息的交换机
    @Bean("normalExchange")
    public DirectExchange normalExchange() {
        return ExchangeBuilder.directExchange(Constants.NORMAL_EXCHANGE).build();
    }

    //绑定关系
    @Bean("normalBinding")
    public Binding normalBinding(@Qualifier("normalQueue") Queue queue, @Qualifier("normalExchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("normal");
    }

    //死信队列
    @Bean("dlQueue")
    public Queue dlQueue() {
        return QueueBuilder.durable(Constants.DL_QUEUE).build();
    }

    //死信交换机
    @Bean("dlExchange")
    public DirectExchange dlExchange() {
        return ExchangeBuilder.directExchange(Constants.DL_EXCHANGE).build();
    }

    //死信绑定关系
    @Bean("dlBinding")
    public Binding dlBinding(@Qualifier("dlQueue") Queue queue, @Qualifier("dlExchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("dl");
    }
生产者
java 复制代码
    public String sendMessage() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
	        rabbitTemplate.convertAndSend(Constants.NORMAL_EXCHANGE,"normal","hello direct " + i);
	        System.out.printf("%tc 消息发送成功 \n",new Date());
        }
        return "test fanout success...";
    }
消费者消费消息

这里只消费死信队列即可,正常的队列不消费,直接等待消息过期,进入死信队列

java 复制代码
    @RabbitListener(queues = "dl")
    public void messageHandler(Message message) throws UnsupportedEncodingException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        System.out.printf("[delay.queue] %tc 接收到消息: %s, deliveryTag: %d \n",new Date(),new String(message.getBody(),"UTF-8"),deliveryTag);

        //业务处理
    }
相关推荐
逻极1 小时前
HarmonyOS 5 鸿蒙多设备适配与分布式开发指南
分布式·华为·harmonyos·鸿蒙
OxYGC8 小时前
[RabbitMQ] 最新版本深度解析:4.0+ 新特性、性能飞跃与生产实践(2025 年更新)
分布式·rabbitmq
Super Rookie8 小时前
RabbitMQ 自动化脚本安装方案
运维·自动化·rabbitmq
武子康9 小时前
Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例
java·数据库·分布式·sql·mongodb·性能优化·nosql
Q飞了14 小时前
分布式存储Ceph与OpenStack、RAID的关系
分布式·ceph·openstack
回家路上绕了弯15 小时前
深入浅出:如何设计一个可靠的分布式 ID 生成器
分布式·后端
阿什么名字不会重复呢17 小时前
Hadoop报错 Couldn‘t find datanode to read file from. Forbidden
大数据·hadoop·分布式
兜兜风d'17 小时前
Spring Boot 整合 RabbitMQ :四大核心模式解析
spring boot·rabbitmq·java-rabbitmq
在未来等你20 小时前
Kafka面试精讲 Day 25:Kafka与大数据生态集成
大数据·分布式·面试·kafka·消息队列