Spring – 动态创建JMSTemplates

我正在使用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”);

哪种方法有利?

请指教。

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

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

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

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

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

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