为什么DefaultMessageListenerContainer不应该使用CachingConnectionFactory?

Eme*_*let 10 spring-jms

我正在阅读关于DefaultMessageListenerContainer的 spring文档

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

谁有人解释原因?

Gar*_*ell 12

  1. 你真的不需要为监听器容器缓存会话,因为会话是长寿的; 缓存对于频繁的短期使用非常有用,例如使用JmsTemplate.
  2. 问题实际上是cacheConsumers = true(默认情况下).当使用动态扩展并且监听器停止时,会话将返回到缓存,但是代理不知道没有人会实际从该会话中消耗,因此您会遇到缓存中的消息,直到缓存中才会被读取当卷增加时,该会话恰好被重用.

注意:如果您希望JmsTemplate在容器线程上运行参与容器事务,则应使用a CachingConnectionFactory来生成缓存,但如果您具有可变并发性,则应禁用工厂中的缓存使用者.

  • 我不确定您还需要多少细节。假设您有5个使用者,工作量减少了,因此容器停止了一个使用者。如果有缓存,则使用方将保持打开状态并放入缓存中,而不是关闭它。由于经纪人对此一无所知,因此他认为它仍然很消耗,因此很高兴向其发送预取消息。由于容器未使用该使用者,因此在其他4个容器中的工作负载增加之前,没有人会看到这些消息,从而决定需要另一个使用者,并再次使用缓存的使用者。 (2认同)