不重启服务 动态停止、启动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();
                }
            }
        }
    }
相关推荐
明达智控技术9 小时前
告别停机内卷!热插拔远程IO,解锁工控运维新范式
分布式·物联网·自动化
漂着的圆木10 小时前
MCP 2026-07-28 长任务改造:别再用 HTTP 超时判断任务失败
分布式·架构·状态模式·ai agent
数智启示录15 小时前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录15 小时前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
数智启示录16 小时前
Apache Kafka 不只是消息队列:日志与 Offset 分离如何让事件可重放 【Kafka合集】
经验分享·分布式·面试·kafka·apache
数智启示录16 小时前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
BYSJMG16 小时前
大数据毕业设计选题推荐:基于大数据的全球气温历史演变分析与可视化,用Hadoop+Spark处理
大数据·hadoop·分布式·信息可视化·spark·kmeans·课程设计
爱吃苹果的梨叔16 小时前
AI 算力监控中心怎么建?分布式坐席 + 大屏联动 + 过程回放
人工智能·分布式·python
無a伟16 小时前
RabbitMQ :与AMQP的关系、核心组件、交换机类型
分布式·rabbitmq
jyOverQ21 小时前
RabbitMQ 消息积压怎么办?Prefetch、消费者并发与扩容
分布式·后端·rabbitmq