首页 > 解决方案 > Spring JMS 定义多个目的地

问题描述

弹簧文档说:

目的地,作为 ConnectionFactory 实例,是您可以在 JNDI 中存储和检索的 JMS 管理对象。配置 Spring 应用程序上下文时,您可以使用 JNDI JndiObjectFactoryBean 工厂类或对对象对 JMS 目标的引用执行依赖注入。

但是,如果应用程序中有大量目的地,或者如果 JMS 提供程序具有独特的高级目的地管理功能,则此策略通常很麻烦。

问题是:

当我的申请中有大量目的地时如何进行?

使用上面提到的策略,我必须定义:

对于每个目的地。

所以如果我有 20 个队列,我将不得不定义 100 个这样的 bean...

标签: javaspringjmsjndispring-jms

解决方案


您可以只使用一个JmsTemplate,CachingConnectionFactoryJndiDestinationResolver...

使用 a 的全部DestinationResolver目的是懒惰地为您解析目的地。使用特定的send或 [ convertAndSend][5]. ThedestinationName will be passed on to theDestinationResolver` 来获取目的地。

唯一的缺点是您需要使用 jndi-name 作为destinationName。


@Bean
public JndiDestinationResolver jndiDestinationResolver() {
  return new JndiDestinationResolver();
}

@Bean
public JmsTemplate jmsTemplate() {
  JmsTemplate jmsTemplate = new JmsTemplate();
  jmsTemplate.setDestinationResolver(jndiDestinationResolver());
  jmsTemplate.setConnectionFactory(connectionFactory());
  return jmsTemplate;
}

有了这个,您可以使用以下内容从 JNDI 动态解析目标。


jmsTemplate.send("jms/queue1", "This is a message");
jmsTemplate.send("jms/queue3", "This is another message");

推荐阅读