【问题标题】:Spring JMS messaging with JmsListener - how it scales?使用 JmsListener 的 Spring JMS 消息传递 - 它如何扩展?
【发布时间】:2018-12-12 01:35:46
【问题描述】:

我正在尝试以可扩展的方式将 Spring JMS 消息与 @JmsListener 一起使用,但我没有看到它发生。我有一个 ConnectionFactory bean,它返回一个通过 JMS 和数据库 DataSource 池连接到 Oracle Advanced Queue 的工厂。

问题开始于每个@JmsListener 接收器再次连接到JMS(并因此连接到数据库池)。我的理解是我可以有很多 @JmsListener 方法,每个服务一个,但是这样我做的非常有限。

共享连接是开启的,但是由于每个@JmsListener创建了不同的DefaultMessageListenerContainer,所以每个都有一个数据库连接。

如果我还希望服务同时处理消息并设置container.setConcurrency("3-5"),那么它会打开3 * numberOfListeners 连接。

如果我使用container.setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE),那么从每一秒开始,每个侦听器容器都会与 JMS/数据库连接和断开连接。

我想要一个连接一次(或更多,如果有并发作业要处理)到 JMS/数据库的东西,而不是连接侦听器次数,也不是为每个侦听器每秒连接断开连接。

【问题讨论】:

  • 你找到解决这个问题的方法了吗?如果是这样,请在此处发布。我也有同样的问题

标签: spring spring-boot spring-jms spring-messaging


【解决方案1】:

您可以使用SingleConnectionFactory 包装供应商工厂,所有容器都将使用相同的连接。

【讨论】:

  • 即使这样,由于创建了很多DefaultMessageListenerContainer,每个都尝试从连接中创建会话,然后会话是Oracle数据库连接。看来我也需要共享会话,而不仅仅是连接。默认值和container.setCacheLevel(DefaultMessageListenerContainer.CACHE_SESSION) 也会出现问题。
  • 那么这就是 Oracle AQ 的工作方式,这已经超出了 Spring 的控制。尝试咨询 Oracle 支持。如果您能与我们分享他们的答案,我们将不胜感激。
  • 但是要监听消息,为什么spring需要创建很多会话呢?它不能只使用许多消费者吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2011-03-01
  • 2019-06-21
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
相关资源
最近更新 更多