我正在使用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对象,则可以创建类似的JmsTemplates地图.使用此JmsTempalte contructor并在一个循环(或流)之后,您可以拥有JmsTemplates的映射.所以发送很容易.
更难的部分是听众.如果您有动态目标,则需要忘记侦听器注释(@JmsListener).您可以通过创建DefaultMessageListenerContainer的映射来使其工作.
每个容器都将由以下内容创建:
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setDestination(topic);
container.setMessageListener(listenerInstance);
container.start();
您还可以通过停止,关闭,….控制每个侦听器容器的生命周期.
但请记住,以这种方式处理大量队列可能会占用大量资源.此外,您可能需要小心自己关闭资源(Spring不会为您做到这一点).
标签:java,spring,spring-boot,jms
来源: https://codeday.me/bug/20191006/1859339.html