Java springjms定义多个目的地

Java springjms定义多个目的地,java,spring,jms,jndi,spring-jms,Java,Spring,Jms,Jndi,Spring Jms,报告说: 作为ConnectionFactory实例的目标是由JMS管理的 可以在JNDI中存储和检索的对象。在配置 在Spring应用程序上下文中,您可以使用JNDI JndiObjectFactoryBean 要对其执行依赖项注入的factory类或 对象对JMS目标的引用 然而,这一策略 如果世界上有大量目的地,则通常会很麻烦 应用程序或是否有高级目的地管理功能 JMS提供程序独有。 问题是: 当我的应用程序中有大量目的地时,如何继续 使用上述策略,我必须定义: JNDetemplate

报告说:

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

然而,这一策略 如果世界上有大量目的地,则通常会很麻烦 应用程序或是否有高级目的地管理功能 JMS提供程序独有。

问题是:

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

使用上述策略,我必须定义:

  • JNDetemplate
  • JndiDestinationResolver
  • JndiObjectFactoryBean
  • 卡钦连接厂
  • JmsTemplate
对于每个目的地


因此,如果我有20个队列,我必须定义100个这样的bean…

Spring文档中的注释说明了“对目标端点使用JNDI”与“对目标端点不使用JNDI”。那么在您的情况中,您的目的地是否存储在JNDI中?如果你不必使用它,那就忘了它吧。只从JNDI加载您的ConnectionFactory(一个对象),或者从头开始创建它

然后,您不必为每个目的地分配一个Springbean。您可能只有一个Java“消费者bean”,然后使用JmsTemplate。我猜您的连接工厂是相同的,因此只有一个
新的JmsTemplate(connectionFactory)
。然后根据需要执行createSession/createConsumer等操作。

您可以只使用一个,然后

使用
DestinationResolver
的全部目的就是为您惰性地解析目标。使用特定的或[
convertAndSend][5]。
destinationname
将被传递到
DestinationResolver`以获取目标

唯一的缺点是需要使用jndi名称作为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");

问题是,我的队列是在JNDI文件中定义的,它们相当大。感谢您的回复。您可以延迟解析目标,您只需要一个
JmsTemplate
ConnectionFactory
(假设它们都使用相同的JMS提供程序/实例)。可以使用
JmsTemplate
上的
send(destination,message)
方法懒洋洋地查找其他所有内容。