Spring JMS定义多个目的地

时间:2019-04-01 17:51:45

标签: java spring jms jndi spring-jms

spring documentation说:

  

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

     

但是,这种策略   如果目的地中有很多目的地,通常会很麻烦   应用程序或是否具有高级目标管理功能   对于JMS提供程序而言是唯一的。

问题是:

当我的应用程序中有很多目的地时,如何进行?

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

  • JndiTemplate
  • JndiDestinationResolver
  • JndiObjectFactoryBean
  • CachingConnectionFactory
  • JmsTemplate

针对每个目的地。

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

2 个答案:

答案 0 :(得分:1)

Spring文档中的注释对“使用JNDI作为目标端点”与“不使用JNDI作为目标端点”进行了注释。因此,就您而言-目标存储在JNDI中吗?如果您不必使用它,那就算了。只能从JNDI加载ConnectionFactory(一个对象),或者只是从头开始创建它。

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

答案 1 :(得分:1)

您可以只使用一个JmsTemplateCachingConnectionFactoryJndiDestinationResolver ...

使用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");