目的地(作为ConnectionFactory实例)由JMS管理 您可以在JNDI中存储和检索的对象。配置一个 在Spring应用程序上下文中,可以使用JNDI JndiObjectFactoryBean 工厂类或对它执行依赖项注入 您的对象对JMS目标的引用。
但是,这种策略 如果目的地中有很多目的地,通常会很麻烦 应用程序或是否具有高级目标管理功能 对于JMS提供程序而言是唯一的。
问题是:
当我的应用程序中有很多目的地时,如何进行?
使用上述策略,我必须定义:
针对每个目的地。
因此,如果我有20个队列,则必须定义100个这样的bean ...
答案 0 :(得分:1)
Spring文档中的注释对“使用JNDI作为目标端点”与“不使用JNDI作为目标端点”进行了注释。因此,就您而言-目标存储在JNDI中吗?如果您不必使用它,那就算了。只能从JNDI加载ConnectionFactory(一个对象),或者只是从头开始创建它。
然后,您不必为每个目的地分配一个Spring bean。您可能只有一个Java“消费者bean”,然后使用JmsTemplate。我猜您的连接工厂是相同的,因此只有一个new JmsTemplate(connectionFactory)
。然后根据需要执行createSession / createConsumer等。
答案 1 :(得分:1)
您可以只使用一个JmsTemplate
,CachingConnectionFactory
和JndiDestinationResolver
...
使用DestinationResolver
的全部目的是为您延迟解决目的地。使用特定的send
或[convertAndSend][5]. The
destininationName will 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");