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
对象,则可以创建JmsTemplate
s 的类似地图。使用此JmsTempalte contructor 并在一个循环(或流)之后,您可以获得JmsTemplate
s 的地图。所以发送很容易。
更难的部分是听众。如果您有动态目的地,则需要忘记侦听器注释 (@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 Failover transport + Spring JmsTemplate 不断重连
spring activemq jmsTemplate.setTimeToLive 需要比指定毫秒更长的时间才能删除消息