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