Spring JMS定义了多个目的地

问题描述 投票:1回答:2

spring documentation说:

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

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

问题是:

当我的应用程序中有大量目的地时,如何继续?

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

  • JndiTemplate
  • JndiDestinationResolver
  • 同JndiObjectFactoryBean
  • CachingConnectionFactory
  • JmsTemplate的

对于每个目的地。

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

java spring jms jndi spring-jms
2个回答
1
投票

Spring文档中的注释记录了“将JNDI用于目标端点”与“不使用JNDI用于目标端点”。那么在您的情况下 - 您的目的地是否存储在JNDI中?如果您不必使用它,请忘记它。只从JNDI加载ConnectionFactory(一个对象)或者只是从头创建它。

然后,您不必为每个目标分配一个Spring bean。你可以只有一个Java'消费者bean'然后使用JmsTemplate。我想你的连接工厂是一样的,所以这只是一个new JmsTemplate(connectionFactory)。然后根据需要执行createSession / createConsumer等。


1
投票

你可以使用单个JmsTemplateCachingConnectionFactoryJndiDestinationResolver ......

使用DestinationResolver的重点是懒洋洋地为你解决目的地。使用特定的send或[convertAndSend][5]. ThedestininationNamewill 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");
© www.soinside.com 2019 - 2024. All rights reserved.