不重启服务 动态停止、启动RabbitMQ消费者 监听器

在消费RabbitMQ消息的过程中,有时候可能会想先暂停消费一段时间,然后过段时间再启动消费者,这个需求怎么实现呢?我们可以借助RabbitListenerEndpointRegistry这个类来实现,它的全类名是org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry,通过这个类可以实现全部队列消息的启动、停止消费,也可以实现指定队列消息的启动、停止消费。

停止、启动全部队列消费

RabbitListenerEndpointRegistry类提供了start()方法和stop()方法,可以看到底层都是通过调用getListenerContainers()获取到所有队列的消费监听容器列表,然后遍历挨个调用对应的start()方法和stop()方法。

java 复制代码
	@Override
	public void start() {
		for (MessageListenerContainer listenerContainer : getListenerContainers()) {
			startIfNecessary(listenerContainer);
		}
	}
 
	@Override
	public void stop() {
		for (MessageListenerContainer listenerContainer : getListenerContainers()) {
			listenerContainer.stop();
		}
	}

我们只需要获取到RabbitListenerEndpointRegistry对象,然后调用其start()方法和stop()方法即可实现启动/停止所有队列消费。

java 复制代码
//如果mq堆积,就先暂停某个队列
        if (messageCount > 180) {
            Collection<MessageListenerContainer> listenerContainers = rabbitListenerEndpointRegistry.getListenerContainers();
            for (MessageListenerContainer container : listenerContainers) {
                SimpleMessageListenerContainer con = (SimpleMessageListenerContainer) container;
                //消息监听容器要消费的队列名称集合
                List<String> queueNamesList = Arrays.asList(con.getQueueNames());
                //判断容器中的队列名称是否包含需要调整的队列名参数
                if (queueNamesList.contains(QUEUE_NAME) && con.isRunning()) {
                    log.info("暂停某某队列!");
                    con.stop();
                }
            }
        } else {
            Collection<MessageListenerContainer> listenerContainers = rabbitListenerEndpointRegistry.getListenerContainers();
            for (MessageListenerContainer container : listenerContainers) {
                SimpleMessageListenerContainer con = (SimpleMessageListenerContainer) container;
                //消息监听容器要消费的队列名称集合
                List<String> queueNamesList = Arrays.asList(con.getQueueNames());
                //判断容器中的队列名称是否包含需要调整的队列名参数
                if (queueNamesList.contains(QUEUE_NAME) && !con.isRunning()) {
                    log.info("开启某某队列!");
                    con.start();
                }
            }
        }
    }
相关推荐
KmSH8umpK1 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第三篇
redis·分布式·wpf
Dontla4 小时前
aio-pika介绍(基于asyncio的Python异步消息队列客户端,用于操作RabbitMQ,并实现对AMQP协议支持)
python·rabbitmq·ruby
KmSH8umpK4 小时前
SpringBoot 分布式锁实战:从单机锁到Redis分布式锁全覆盖,解决超卖、重复下单、幂等并发问题
spring boot·redis·分布式
KmSH8umpK7 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案
redis·分布式·wpf
_F_y9 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(3)
c++·算法·rabbitmq
长河9 小时前
XXL-JOB 从本地快速上手到核心架构深度解析
分布式
juniperhan9 小时前
Flink 系列第22篇:Flink SQL 参数配置与性能调优指南:从 Checkpoint 到聚合优化
大数据·数据仓库·分布式·sql·flink
juniperhan18 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
marsh02061 天前
41 openclaw分布式会话管理:跨服务状态同步方案
分布式·ai·编程·技术
杰建云1671 天前
Plurai 分布式推理引擎深度评测
分布式