目标,作为ConnectionFactory实例,是可以在JNDI中存储和检索的JMS管理对象。配置Spring应用程序上下文时,可以使用JNDI JndiObjectFactoryBean工厂类或对对象的JMS目标引用执行依赖项注入。
但是,如果应用程序中存在大量目标,或者存在JMS提供程序特有的高级目标管理功能,则此策略通常很麻烦。
问题是:
当我的应用程序中有大量目的地时,如何继续?
使用上面提到的策略,我必须定义:
对于每个目的地。
所以,如果我有20个队列,我将不得不定义100个这样的bean ...
Spring文档中的注释记录了“将JNDI用于目标端点”与“不使用JNDI用于目标端点”。那么在您的情况下 - 您的目的地是否存储在JNDI中?如果您不必使用它,请忘记它。只从JNDI加载ConnectionFactory(一个对象)或者只是从头创建它。
然后,您不必为每个目标分配一个Spring bean。你可以只有一个Java'消费者bean'然后使用JmsTemplate。我想你的连接工厂是一样的,所以这只是一个new JmsTemplate(connectionFactory)
。然后根据需要执行createSession / createConsumer等。
你可以使用单个JmsTemplate
,CachingConnectionFactory
和JndiDestinationResolver
......
使用DestinationResolver
的重点是懒洋洋地为你解决目的地。使用特定的send
或[convertAndSend][5]. The
destininationNamewill be passed on to the
DestinationResolver`来获取目的地。
唯一的缺点是您需要使用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");