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