【问题标题】:Spring JMS defining multiple destinationsSpring JMS 定义多个目的地
【发布时间】:2019-08-22 23:05:05
【问题描述】:

spring documentation 说:

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

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

问题是:

当我的应用程序中有大量目的地时如何进行?

使用上面提到的策略我必须定义:

  • Jndi 模板
  • JndiDestinationResolver
  • JndiObjectFactoryBean
  • 缓存连接工厂
  • Jms 模板

对于每个目的地。

所以如果我有 20 个队列,我将不得不定义 100 个这样的 bean...

【问题讨论】:

  • 您可以懒惰地解析目的地,您只需要一个 JmsTemplateConnectionFactory(假设它们都使用相同的 JMS 提供程序/实例)。可以使用JmsTemplate 上的send(destination, message) 方法懒惰地查找其他所有内容。

标签: java spring jms jndi spring-jms


【解决方案1】:

Spring 文档中的注释说明了“将 JNDI 用于目标端点”与“不将 JNDI 用于目标端点”。所以在您的情况下 - 您的目的地是否存储在 JNDI 中?如果您不必使用它,请忘记它。仅从 JNDI 加载 ConnectionFactory(一个对象)或从头开始创建它。

然后您不必为每个目的地分配一个 Spring bean。您可能只有一个 Java 'consumer bean',然后使用 JmsTemplate。我猜你的连接工厂是一样的,所以只有一个new JmsTemplate(connectionFactory)。然后根据需要做createSession/createConsumer等。

【讨论】:

  • 问题是我的队列是在 JNDI 文件中定义的,而且它们非常大。谢谢你的回复。
【解决方案2】:

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

使用DestinationResolver 的全部意义在于懒惰地为您解析目的地。使用特定的send 或 [convertAndSend][5]. ThedestininationNamewill be passed on to theDestinationResolver` 来获取目的地。

唯一的缺点是您需要使用 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");

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2017-09-09
    • 2013-03-03
    • 2018-09-06
    • 2017-02-12
    • 2021-09-16
    • 2019-01-06
    • 2018-10-29
    • 2013-07-10
    相关资源
    最近更新 更多