在消费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();
}
}
}
}