Spring - 动态创建JMSTemplates

时间:2015-09-01 13:24:04

标签: java spring spring-boot jms

我正在使用Spring启动,我想动态创建多个JMS模板,因为我想连接到不同的JMS实例。我知道使用注释的标准方法,将ConnectionFactory链接到JMSTemplate。我希望每个不同的JMS实例都有不同的JMSTemplate。

我目前已将连接详细信息加载到Map中,我想为每个键动态创建一个JMSTemplate。

主要目的是根据地图查找将消息发布到主题目的地。但是对于测试来说,也可以有听众。

潜在方法:

1)将JMSTemplates添加到与Spring Component关联的映射中,并在spring组件映射上查找JMSTemplate。

2)使用:

动态注册多个jmsTemplate bean怎么样?

BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JmsTemplate.class);             CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();

         builder.addPropertyValue("connectionFactory", cachingConnectionFactory);      // set property value
        DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
        factory.registerBeanDefinition("jmsTemplateName", builder.getBeanDefinition());

然后查找jms bean - > ctx.getBean(" jmsTemplateName&#34);

哪种方法有利?

请告知。

1 个答案:

答案 0 :(得分:0)

因此,如果地图中有ConnectionFactory个对象,则可以创建JmsTemplate s的类似地图。使用此JmsTempalte contructor并在一个循环(或流)之后,您可以拥有JmsTemplate的映射。所以发送很容易。

更难的部分是听众。如果您有动态目标,则需要忘记侦听器注释(@JmsListener)。您可以通过创建DefaultMessageListenerContainer的地图来使其正常工作。

每个容器都将由以下内容创建:

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestination(topic);
container.setMessageListener(listenerInstance);
container.start();

您还可以通过stop,shutdown,....控制每个侦听器容器的生命周期。

但请记住,以这种方式处理大量队列可能会占用大量资源。此外,你需要注意自己关闭资源(Spring不会为你做这件事)。