为什么暂停队列不是代理功能?

sli*_*lim 1 activemq-classic

我正在寻找一个ActiveMQ经纪人admin命令,告诉它暂停队列-即:

  • 继续接受来自生产客户的消息
  • 停止交付给使用中的客户端,允许队列积压增长,直到恢复队列为止,随后将积压发送给客户端。

我找不到这样的命令。最常见的答案是应该在客户端对其进行管理-即找到每个消费者并停止它。其他答案是解决方法,例如操纵网络路由或防火墙,以便客户端和代理不再通信。

对其他消息队列的粗略调查表明,ActiveMQ在这方面并不罕见。

在我看来,可能无法实现此功能有两个原因:

  • 这很难实现-但我无法想到任何原因。
  • 这与消息队列的设计原理背道而驰

是什么,为什么?

Ste*_*ier 6

新发布的ActiveMQ 5.12.0支持暂停队列:

当队列“暂停”时:

  • 没有消息发送给准消费者

  • 消息仍要排队入队

  • 能够浏览队列的能力

  • 队列的所有JMX计数器都可用并且正确。

...

实现的暂停/恢复/ isPaused队列视图mbean操作和属性

暂停后,将不会分派给常规队列使用者,也不会像往常一样发送和浏览工作。所有机上消息将继续进行,直到正常应答为止。

参见https://issues.apache.org/jira/browse/AMQ-5229

如果您启用了Jolokia(我认为现在默认情况下启用了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
Run Code Online (Sandbox Code Playgroud)

(使用默认的用户名,密码和代理名称以及名为myQueue的队列)

为了恢复队列,将“ pause”替换为“ resume”。

  • 从理论上讲,这可能会回答问题,但[最好](//meta.stackoverflow.com/q/8259)在此处包含答案的基本部分,并提供链接以供参考。 (3认同)