防止将 CachingConnectionFactory 与 DefaultJmsListenerContainerFactory 一起使用

问题描述 投票:0回答:2

我正在开发一个全新的项目,其中我需要有监听器来消费来自多个队列的消息(目前不需要生产者)。

从头开始,我使用的是最新的 Spring JMS 版本(4.1.2)。

这是我的配置文件的摘录:

<bean id="cachedConnectionFactory" 
          class="org.springframework.jms.connection.CachingConnectionFactory"
        p:targetConnectionFactory-ref="jmsConnectionFactory"
        p:sessionCacheSize="3" />

<bean id="jmsListenerContainerFactory"
          class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"
          p:connectionFactory-ref="cachedConnectionFactory"
          p:destinationResolver-ref="jndiDestinationResolver"
          p:concurrency="3-5"
          p:receiveTimeout="5000" />

但我认为我可能是错的,因为 DefaultJmsListenerContainerFactory 将构建常规的 DefaultMessageListenerContainerS。并且,如 doc 中所述,CachingConnectionFactory 不应与消息侦听器容器一起使用...

  • 即使我使用新的 Spring 4.1 DefaultJmsListenerContainerFactory 类,来自 post 的答案仍然有效(cacheConsumers = true 可能是一个问题+不需要为侦听器容器缓存会话,因为会话是长期存在的),对吗?
  • 我不应该使用 CachingConnectionFactory,而应该使用 SingleConnectionFactory(而不是直接使用代理实现)?
  • 如果确实应该使用 SingleConnectionFactory 类,那么“reconnectOnException”属性是否应该设置为 true(如在 CachingConnectionFactory 中完成的那样),或者新的“setBackOff”方法(来自 DefaultJmsListenerContainerFactory)是否处理相同类型的问题?

感谢您的任何提示

spring spring-jms
2个回答
1
投票
  • 正确。
  • 使用
    SingleConnectionFactory
    并没有多大好处,除非你想在多个容器之间共享单个连接;默认情况下,
    DMLC
    将为所有使用者线程 (
    cacheLevel >= CACHE_CONNECTION
    ) 使用来自供应商工厂的单个连接,除非配置了
    TransactionManager
  • 容器将处理重新连接 - 甚至在“新”
    backOff
    属性之前 -
    backOff
    只是为重新连接算法增加了更多复杂性 - 它过去只是每 n 秒重试一次(默认为 5 秒)。

正如您引用的答案中所述,只要禁用消费者缓存,就可以使用

CCF

更正: 是的,当使用

SingleConnectionFactory
时,您需要将reconnectOnException
设置为
true
,以便容器正确恢复其连接。否则,它只会放弃陈旧的连接。


0
投票
Basic Caching Connection Factory:此代码创建一个具有默认设置的CachingConnectionFactory,它通常不指定任何会话、生产者或消费者缓存。 默认缓存行为:如果没有任何特定的缓存设置,工厂可能不会缓存会话、生产者或消费者,或者可能使用默认缓存设置,根据实现的不同,默认缓存设置可能是最小的或没有。

© www.soinside.com 2019 - 2024. All rights reserved.