Производители не очищаются при использовании CachingConnectionFactory
Кажется JMSProducer
не доставляет мусор и продолжает работать после доставки сообщений в очередь, я использую Spring 3.2.2 и CachingConnectionFactory
с настройкой Keep-alive для отправки сообщения.
Количество продюсеров продолжает увеличиваться каждый раз, когда я отправляю сообщение.
Это связано с версией весны, которую я использую?
или я что-то не так делаю в своей конфигурации?
1 ответ
Вам нужно позвонить close()
метод на вашем MessageProducer
, Согласно документации Java:
void close() throws JMSException
Закрывает сообщение производителя.
Поскольку поставщик может выделять некоторые ресурсы от имени
MessageProducer
вне виртуальной машины Java клиенты должны закрывать их, когда они не нужны. Полагаться на сборку мусора, чтобы в конечном итоге вернуть эти ресурсы, может быть недостаточно своевременно.
Согласно весенней документации CachingConnectionFactory:-
ПРИМЕЧАНИЕ. Для этого ConnectionFactory требуется явное закрытие всех сеансов, полученных из его общего подключения. В любом случае это обычная рекомендация для собственного кода доступа JMS. Однако с этим ConnectionFactory его использование является обязательным, чтобы фактически разрешить повторное использование сеанса.
Таким образом, вам нужно вызвать getCachedSessionProxy вместо getSession и, как только закончится с отправкой сообщения, вызвать close() (в блоке finally) . Согласно исходному коду, вызов close для этого прокси-сервера сеанса обрабатывается так, что сеанс и обработчик сообщений используются повторно. Комментарии Гэри заявляют то же самое.