为什么DefaultMessageListenerContainer不应该使用CachingConnectionFactory?

时间:2014-02-24 09:59:25

标签: spring-jms

我正在阅读有关DefaultMessageListenerContainer

的春季文档

它说“注意:不要将Spring的CachingConnectionFactory与动态扩展结合使用。理想情况下,根本不要将它与消息侦听器容器一起使用,因为通常最好让侦听器容器本身处理适当的缓存它的生命周期。此外,停止和重新启动监听器容器只能使用独立的本地缓存连接 - 而不是外部缓存的连接。“

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:10)

  1. 您确实不需要为侦听器容器缓存会话,因为会话是长期存在的;缓存非常有利于频繁的短期使用,例如使用JmsTemplate。
  2. 问题实际上是cacheConsumers = true(默认值)。当使用动态扩展并且监听器停止时,会话将返回到缓存,但是代理不知道没有人会实际从该会话中消耗,因此您会遇到缓存中的消息,直到缓存中才会被读取当卷增加时,该会话恰好被重用。
  3. 注意:如果您希望容器线程上运行JmsTemplate参与容器事务,使用CachingConnectionFactory,以便生成器可以缓存,但是如果你有可变并发性,你应该在工厂中禁用缓存消费者。