Why DefaultMessageListenerContainer should not use CachingConnectionFactory?
Solution 1:
- You really don't need to cache sessions for listener containers because the sessions are long lived; caching is very beneficial for frequent short use, such as with the JmsTemplate.
- The problem is really when
cacheConsumers = true
(the default). When using dynamic scaling and a listener is stopped, the session is returned to the cache but the broker doesn't know that nobody will actually consume from that session, so you are stuck with messages sitting in the cache that won't be read until that session happens to be reused when the volume increases.
Note: if you wish a JmsTemplate
running on the container thread to participate in a container transaction, you should use a CachingConnectionFactory
so the producers can be cached, but you should disable caching consumers in the factory if you have variable concurrency.