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

时间:2013-02-18 10:19:38

标签: activemq

我正在寻找一个ActiveMQ代理管理员命令,告诉它暂停一个队列 - 即:

  • 继续接受来自制作客户的消息
  • 停止向消费客户提供服务,允许队列积压增长,直到队列恢复,然后将积压发送给客户。

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

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

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

  • 很难实现 - 但我想不出任何理由。
  • 这与消息队列的设计理念背道而驰

这是什么,为什么?

2 个答案:

答案 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,而不是直接在队列上。