Spring - 动态创建 JMSTemplates

Posted

技术标签:

【中文标题】Spring - 动态创建 JMSTemplates【英文标题】:Spring - Dynamically create JMSTemplates 【发布时间】:2015-11-26 18:18:12 【问题描述】:

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

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

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

可能的方法:

1) 将 JMSTemplate 添加到与 Spring 组件关联的映射中,并在 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");

哪种方法是有利的?

请指教。

B

【问题讨论】:

您是打算轮询 MQ 还是还想动态注册监听器? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

感谢您的回复。 @user518066 你用这种方法有什么成功吗? 我个人从来不需要这个。我只是勾勒出理论如何可行。如果你可以通过这种方式创建单个 JMS 接口,我看不出你不能创建更多的原因

以上是关于Spring - 动态创建 JMSTemplates的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jmsTemplate 总是为空?使用 spring 和 Apache ActiveMQ [重复]

学习ActiveMQ:spring与ActiveMQ整合

Spring面试题集锦

Spring面试题集锦

ActiveMQ Failover transport + Spring JmsTemplate 不断重连

spring activemq jmsTemplate.setTimeToLive 需要比指定毫秒更长的时间才能删除消息