我正在寻找一个ActiveMQ代理管理员命令,告诉它暂停一个队列 - 即:
我无法找到这样的命令。最常见的答案是它应该在客户端进行管理 - 也就是说,找到每个消费者并停止它。其他答案是解决方法,例如操纵网络路由或防火墙,以便客户端和代理无法再进行通信。
粗略调查其他消息队列表明ActiveMQ在这方面并不罕见。
在我看来,有两个原因可能无法实现此功能:
这是什么,为什么?
答案 0 :(得分:6)
新发布的ActiveMQ 5.12.0支持能够暂停队列:
当队列“暂停”时:
没有发送给关联消费者的消息
仍然要在队列中排队的消息
能够浏览队列的能力
队列的所有JMX计数器都可用且正确。
...
实现了pause / resume / isPaused队列视图mbean ops和attribute
暂停时,没有派遣到常规队列消费者,发送 并正常浏览工作。任何机上信息都将继续飞行 直到ackes正常。
请参阅https://issues.apache.org/jira/browse/AMQ-5229
如果你启用了Jolokia(我认为现在默认启用它),你可以使用类似下面的curl请求来暂停队列:
curl --user admin:admin http://127.0.0.1:8161/api/jolokia/exec/org.apache.activemq:brokerName=localhost,destinationName=myQueue,destinationType=Queue,type=Broker/pause
(使用默认用户名,密码和代理名称以及名为myQueue的队列)
将“pause”替换为“resume”以恢复队列。
答案 1 :(得分:4)
正如你所说,可能没有太复杂的实施。 我不知道这是否是一个积极的设计决定,如果没有需求。其他类似的产品,例如IBM WebSphere MQ在队列上实现“get / put inhibit”,因此它显然不是完全违背消息传递的哲学 - 而是一种操作和解决实时系统故障的工具。
我有点偏颇,但我实际上喜欢将发送者与接收器分离(如果是两个不同的系统,最终可能会被切换/升级/更改......)。
一种简单的方法来解耦系统,并能够做你想做的事情是让发送者发送到一个队列“DATA.OUT”,接收者听另一个“DATA.IN”。然后,您可以使用Apache Camel(通常与ActiveMQ捆绑在一起实现企业集成模式),从DATA.OUT路由到DATA.IN。
可以通过JMX启动/停止Camel Route,这将实现类似于您所描述的内容。
我认为ActiveMQ设计在这个问题上而不是你在中间件层中做这些事情,比如Apache Camel,而不是直接在队列上。