Почему DefaultMessageListenerContainer не должен использовать CachingConnectionFactory?

Я читал весеннюю документацию по DefaultMessageListenerContainer

В нем говорится: «Не используйте Spring CachingConnectionFactory Spring в сочетании с динамическим масштабированием. В идеале не используйте его вообще с контейнером прослушивателя сообщений, так как обычно предпочтительно, чтобы сам контейнер-слушатель обрабатывал соответствующее кэширование в течение своего жизненного цикла. Кроме того, остановка и перезапуск контейнера-слушателя будет работать только с независимым локально кэшированным соединением, а не с внешним кэшированием ».

Может ли кто-нибудь объяснить, почему?

  1. Вам действительно не нужно кэшировать сеансы для контейнеров-слушателей, потому что сеансы долговечны; кеширование очень полезно для частого короткого использования, например, с помощью JmsTemplate.
  2. Проблема действительно в том, что cacheConsumers = true (по умолчанию). При использовании динамического масштабирования и остановки слушателя сеанс возвращается в кеш, но брокер не знает, что на этом сеансе никто не будет потреблять, поэтому вы застряли в сообщениях, находящихся в кеше, которые не будут прочитаны до тех пор, пока эта сессия используется повторно при увеличении громкости.

Примечание. Если вы хотите, чтобы JmsTemplate работающий в streamе контейнера, участвовал в транзакции контейнера, вы должны использовать CachingConnectionFactory чтобы производители могли кэшироваться, но вы должны отключить кеширование потребителей на заводе, если у вас есть переменная параллелизм.

Давайте будем гением компьютера.