1

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

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

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

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

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

  • 这很难实施——但我想不出任何原因。
  • 与消息队列的设计理念背道而驰

它是哪一个,为什么?

4

2 回答 2

6

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

当队列“暂停”时:

  • 没有消息发送给关联消费者

  • 消息仍在队列中排队

  • 能够浏览队列

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

...

实现了 pause/resume/isPaused 队列视图 mbean ops 和属性

暂停时,不会向常规队列消费者分派,发送和浏览工作正常。任何飞行消息都将继续飞行,直到正常确认。

请参阅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 的队列)

将“暂停”替换为“恢复”以恢复队列。

于 2015-08-23T09:30:14.747 回答
4

正如您所说,实施起来可能不太复杂。我不知道如果没有需求,这是否是一个积极的设计决策。其他类似的产品,例如 IBM WebSphere MQ,在队列上实现了“禁止获取/放置”,因此它显然并不完全违反消息传递的理念——而是一种操作和解决实时系统故障的工具。

我有点偏见,但我实际上喜欢将发送方与接收方分离(如果是两个不同的系统,最终可能会被切换/升级/更改..)。

一种解耦系统并能够做你想做的事情的简单方法是让发送者发送到一个队列“DATA.OUT”,接收者监听另一个“DATA.IN”。然后您可以使用 Apache Camel(通常与 ActiveMQ 捆绑以实现企业集成模式)从 DATA.OUT 路由到 DATA.IN。

骆驼路线可以通过 JMX 启动/停止,这将实现类似于您描述的内容。

我猜 ActiveMQ 设计在这件事上宁愿让你在中间件层中做这些事情,比如 Apache Camel,而不是直接在队列上。

于 2013-02-18T20:37:27.980 回答