Spring - 动态创建 JMSTemplates

Spring - Dynamically create JMSTemplates

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

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

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

可能的方法:

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

2) 使用以下方法动态注册多个 jmsTemplate bean 怎么样:

BeanDefinitionBuilder 构建器 = 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");

哪种方法更受欢迎?

请指教

B

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

更难的部分是听众。如果您有动态目的地,则需要忘记侦听器注释 (@JmsListener)。您可以通过创建 DefaultMessageListenerContainer.

的地图来使其工作

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

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

您还可以通过停止、关闭...来控制每个侦听器容器的生命周期。

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