目录
●问题起因
使用ActiveMQ的过程中,有这么一个很常见的需求:如果我的消息消费者压力过大,接收消息来不及处理,我想暂停接收消息,先处理完已接收到的消息后,再恢复继续接收新的消息。
比较诡异的是,这样一个看似简单的功能,百度上居然没有一个适用的方案,大家不信的话可以搜索试试:
第一篇文章看似OK,但是点进去你会发现他的实现方式依旧繁琐(一会儿把connection对象放进map,一会儿去进行close操作)更别说性能了。
●解决方案
如果用过Kafka的同学肯定知道,KafkaConsumer对象提供了两个方法,pause()和resume(),用来暂停和恢复接收。思路上也很直观,就是针对消费者采用“暂停”和“恢复”的动作。然而,如果大家去阅读ActiveMQ或者JMS的API文档,你会发现消费者MessageConsumer并没有提供这样的方法。难道这样的需求ActiveMQ会不支持?
在搜索百度无果的情况下,笔者去ActiveMQ的官网寻找结论,也未果,遂直接阅读了JMS规范v1.1的官方手册(大家有兴趣可以前往笔者的空间自行下载),终于在里面发现这么一段描述: