检测其他进程何时正在侦听队列或主题有哪些策略?

问题描述 投票:0回答:2

我有一个系统(我们称之为系统A),允许用户打开某些处理功能。当这些功能被激活时,系统 A 将侦听来自系统 B 的消息。

系统 B 当前始终将这些消息发送到主题,无论系统 A 是否正在侦听。这些消息的生成和发送成本并不高,但尽管如此,如果系统 A 没有监听,我还是想避免发送它们。 (请注意,这些消息不需要持久,系统 A 可以随时开始/停止监听并正常运行。)

我使用 ActiveMQ 作为消息代理。

我可以看到一些可能的解决方案。

  1. 创建系统 A 发送到系统 B 的注册/订阅消息。我不太确定该消息发送的频率,或者双方需要保留哪种状态。

  2. 依靠 ActiveMQ 咨询消息来检测何时没有侦听器。

  3. 在将消息发送到没有侦听器的队列时,将 ActiveMQ 调整为尽可能高效(仍然可能需要生成消息)。

我最喜欢#1 的想法,但我很难看出如何在不显着增加复杂性的情况下将其组合在一起。

jms activemq
2个回答
1
投票

就个人而言,我们采取了将消息放到主题上的方法。特别是如果它是非持久主题,ActiveMQ 在没有侦听器的情况下可以高效发送。另外,使用消息中间件的一大好处是发布者和订阅者不必相互了解或维护状态。

但是,如果业务驱动因素使您仍然希望系统 A 了解消费者,则可以使用 JMX 调用来查看队列或主题上的消费者数量。假设系统 A 可以进行 jmx 调用,您可以定期查询 MBean 对象 org.apache.activemq 上的 ConsumerCount 属性:BrokerName=localhost,Type=Topic,Destination=(替换您自己的 BrokerName 和主题名称),并且如果计数 > 0,则构造消息并将其拖放到主题上。

我会推荐这种方法,因为它将所有状态管理放在 ActiveMQ 上,并且系统 A 不必管理任何状态。


0
投票

咨询消息可以为您提供此类信息,或者您也可以使用 AMQ 中提供的 BrokerStatisticsPlugin,它允许您的客户端发送消息并让代理向您发送有关其当前状态的各种有用信息。它还有一个好处是比 JMX 更容易使用。

参见:http://activemq.apache.org/statisticsplugin.html

如果您想要一个真正与代理无关的解决方案,您可能必须选择选项#1,因为其他选项依赖于 AMQ 特定的功能。

© www.soinside.com 2019 - 2024. All rights reserved.