有什么策略可以检测其他进程何时正在侦听队列或主题?

时间:2011-03-10 16:14:48

标签: jms activemq

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

系统B当前始终将这些消息发送到主题,无论系统A是否正在侦听。生成和发送这些消息并不是非常昂贵,但是如果系统A没有监听的话,我希望避免发送它们。 (请注意,这些消息不需要持久,系统A可以在任何时候开始/停止监听并正常运行。)

我使用ActiveMQ作为消息代理。

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

  1. 创建系统A将发送给系统B的注册/订阅消息。我不太确定此消息的发送频率,或者任何一方需要保留哪种状态。< / p>

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

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

  4. 我最喜欢#1的想法,但是我很难看到如何在不显着增加复杂性的情况下将它们结合在一起。

2 个答案:

答案 0 :(得分:1)

就个人而言,我们采取了将消息放入主题的方法。特别是如果它是一个非持久的话题,ActiveMQ在没有听众的情况下发送效率很高。此外,使用消息传递中间件的一大好处是,发布者和订阅者无需了解彼此或维护状态。

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

我建议使用这种方法,因为它将所有状态管理放在ActiveMQ上,而系统A不必管理任何状态。

答案 1 :(得分:0)

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

请参阅:http://activemq.apache.org/statisticsplugin.html

如果你想要一个真正的经纪人无关的解决方案,你可能不得不选择#1,因为其他人依赖于AMQ特有的功能。

此致

蒂姆www.fusesource.com