首页 文章

防止将CachingConnectionFactory与DefaultJmsListenerContainerFactory一起使用

提问于
浏览
0

我正在开发一个全新的项目,在这个项目中,我需要拥有能够使用来自多个队列的消息的监听器(现在不需要生成器) .

从头开始,我使用的是最后一个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
    • 正确 .

    • 使用 SingleConnectionFactory 并没有太大的好处,除非你想在多个容器之间共享一个连接;除非配置了 TransactionManager ,否则 DMLC 将默认为供应商工厂使用单个连接用于所有使用者线程( cacheLevel >= CACHE_CONNECTION ) .

    • 容器将处理重新连接 - 甚至在'new' backOff 属性之前 - backOff 只是为重新连接算法增加了更多的复杂性 - 它过去每n秒重试一次(默认为5) .

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

    Correction: 是的,当使用 SingleConnectionFactory 时, do 需要将 reconnectOnException 设置为 true ,以便容器正确恢复其连接 . 否则,它只是分发陈旧的连接 .

相关问题