【发布时间】:2014-06-26 20:37:53
【问题描述】:
如果当前没有注册的监听器,是否可以配置消息队列不接受消息?
我想出的解决方案包括通过 API 查询队列信息,并据此决定做什么。这个解决方案似乎有一个缺陷,因为它不是事务性的(存在将消息发布到空队列中的边缘情况,或者我决定不发布它,即使在发布时消费者已经连接)。
【问题讨论】:
如果当前没有注册的监听器,是否可以配置消息队列不接受消息?
我想出的解决方案包括通过 API 查询队列信息,并据此决定做什么。这个解决方案似乎有一个缺陷,因为它不是事务性的(存在将消息发布到空队列中的边缘情况,或者我决定不发布它,即使在发布时消费者已经连接)。
【问题讨论】:
您可以通过编写自己的AcitveMQ Plugin 来实现此行为。它使您可以访问当前代理状态,因此应该消除您所说的边缘情况。
但是,我建议不要进行任何此类操作(无论它们是按照您的建议由客户端控制,还是通过插件由服务器控制)。原因是没有任何消费者的队列的消息无论如何都不会转发。因此,在某些时候,您必须支付检测到没有侦听器的成本(实际上,专用的客户端请求可能比简单地将消息发送到服务器更昂贵)。
如果您使用的是持久队列,您甚至违反了它们的语义。
如果您只是想避免客户端在连接时收到多条消息,请使用每个主题只有一个消费者的主题(以及非持久消息)。
【讨论】: