2016-11-24 72 views
0

Spring提供@JMSListener注释以侦听来自特定队列的消息。还有一个替代implement JmsListenerConfigurer并注册MessageListenerSpring JMS开始根据请求侦听jms队列

在这两种情况下,在应用程序启动时必须知道队列的名称,无论是通过代码中的硬编码还是通过属性。

有没有一种方法可以在应用程序启动之后的很长时间内侦听其名称已知的队列?

回答

1

这应该工作。

  1. 使用虚拟队列名称和id配置@JmsListener
  2. listener container factoryautoStartup配置为false。
  3. 准备就绪后,使用从JmsListenerEndpointRegistry(将注册表自动连接到应用程序并调用getListenerContainer(id))中的id获得对侦听器容器的引用。
  4. 将容器投入到AbstractMessageListenerContainer,并用所需的队列呼叫setDestinationName(或setDestination)。
  5. start()它。
+1

如果您希望动态创建大量容器,那么只需以编程方式创建容器,调用'afterPropertiesSet()',然后调用'start()'。 –

+0

非常感谢!我会尝试这个并更新。如果碰巧有多个请求队列侦听器,您是否会知道与侦听器对象相比容器有多沉重? – Sundeep

+0

我不确定你的意思;每个'@ JmsListener'运行在由工厂创建的'DefaultMessageListenerContainer'中。它实际上与以编程方式创建容器并将POJO侦听器封装在'MessageListenerAdapter'中相同。 –