不重启服务 动态停止、启动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();
                }
            }
        }
    }
相关推荐
记得开心一点嘛40 分钟前
使用MinIO搭建自己的分布式文件存储
分布式·spring cloud·minio
纪元A梦2 小时前
分布式拜占庭容错算法——PBFT算法深度解析
java·分布式·算法
卿着飞翔2 小时前
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
java·rabbitmq·java-rabbitmq
计算机毕设定制辅导-无忧学长3 小时前
从 AMQP 到 RabbitMQ:核心组件设计与工作原理(二)
网络·rabbitmq·ruby
TCChzp7 小时前
Kafka入门-消费者
分布式·kafka
FakeOccupational10 小时前
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制
笔记·分布式·p2p
·云扬·12 小时前
【PmHub面试篇】性能监控与分布式追踪利器Skywalking面试专题分析
分布式·面试·skywalking
后端码匠13 小时前
Spark 单机模式部署与启动
大数据·分布式·spark
Dnui_King13 小时前
Kafka 入门指南与一键部署
分布式·kafka