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

        //业务处理
    }
相关推荐
yangSnowy5 分钟前
MySQL 分布式锁实现方案
数据库·分布式·mysql
ALex_zry33 分钟前
分布式缓存性能优化策略
分布式·缓存·性能优化
七夜zippoe1 小时前
分布式配置中心终极对决 Spring Cloud Config与Apollo架构深度解析
分布式·架构·springcloud·apollo·配置中心
迎仔1 小时前
09-消息队列Kafka介绍:大数据世界的“物流枢纽”
大数据·分布式·kafka
不会代码的小测试1 小时前
UI自动化-Grid分布式运行
运维·分布式·python·selenium·自动化
Vivienne_ChenW1 小时前
Apollo 配置中心核心用法(实战版)
java·开发语言·分布式·阿里云·产品运营
自可乐1 小时前
Ray分布式AI计算框架完整学习教程
人工智能·分布式·机器翻译
麦兜*15 小时前
深入解析现代分布式事务架构:基于Seata Saga模式与TCC模式实现金融级高可用与数据最终一致性的工程实践全解析
分布式·金融·架构
難釋懷16 小时前
分布式锁-redission功能介绍
分布式
only-qi18 小时前
微服务场景下,如何实现分布式事务来保证一致性?
分布式·微服务·架构