防止将CachingConnectionFactory与DefaultJmsListenerContainerFactory一起使用

时间:2014-11-19 16:40:11

标签: spring spring-jms

我正在开发一个全新的项目,我需要让听众使用来自多个队列的消息(现在不需要生成器)。

从头开始,我使用的是最后一个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可能是一个问题+不需要为侦听器容器缓存会话,因为会话很长) , 对?
  • 我应该使用SingleConnectionFactory而不是使用CachingConnectionFactory(而不是直接使用代理实现)?
  • 如果确实应该使用SingleConnectionFactory类,那么“reconnectOnException”属性应该设置为true(就像在CachingConnectionFactory中一样),或者新的“setBackOff”方法(来自DefaultJmsListenerContainerFactory)是否处理​​相同类型的问题是什么?

感谢您提供任何提示

1 个答案:

答案 0 :(得分:0)

  • 正确。
  • 除非您希望跨多个容器共享单个连接,否则使用SingleConnectionFactory并没有多大好处;默认情况下,DMLC将使用供应商工厂中的所有消费者线程(cacheLevel >= CACHE_CONNECTION)的单个连接,除非配置了TransactionManager
  • 容器将处理重新连接 - 甚至在'新'backOff属性之前 - backOff只是为重新连接算法增加了更多的复杂性 - 它过去每n秒重试一次(5默认值)。

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

更正:是的,在使用SingleConnectionFactory时,执行需要将reconnectOnException设置为true才能使用{{1}}容器以正确恢复其连接。否则,它只是分发陈旧的连接。