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 不会为您做这件事)。
我正在使用 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 不会为您做这件事)。