#java #spring #jms #spring-jms
#java #spring #jms #spring-jms
Вопрос:
Мы только что обновились до Spring 4 и JMS 2.0. Мы используем CachingConnectionFactory
и a JmsTemplate
для публикации сообщений и заметили, что при публикации в пункт назначения первая попытка срабатывает, а затем дальнейшие попытки опубликовать в том же пункте назначения вызывают следующее исключение:
Вызвано: javax.jms.IllegalStateException: производитель закрыт
С Spring 3.2 и JMS 1.1 все работало нормально, поэтому я немного покопался, чтобы понять, в чем проблема, и, похоже, проблема в CachedMessageProducer
классе. Обычно этот класс повторно реализует все методы в MessageProducer
интерфейсе. В частности, существует close()
метод, который повторно реализован и только сбросит свойства, но сохранит производителя в рабочем состоянии (поскольку это фабрика кэширования) после отправки сообщения с использованием JmsTemplate
.
Однако в Spring 4 есть новый метод под названием getProxyIfNecessary
, который определяет, используется ли JMS 2.0, и когда он обнаруживает JMS 2.0, он создает Jms2MessageProducerInvocationHandler
прокси. Метод invoke этого прокси делегирует все вызовы исходному MessageProducer
объекту и, похоже, обходит вызовы методов в CachedMessageProducer. Конечным результатом является то, что метод close вызывается для исходного MessageProducer
объекта (который нам не нужен, поскольку он должен быть кэширован). Это означает, что будущие попытки публикации приводят к исключению, что производитель был закрыт.
У кого-нибудь еще была эта проблема раньше? Я не уверен, делаю ли я что-то неправильно или это ошибка с новой поддержкой JMS 2.0 весной.
Комментарии:
1. Я предполагаю, что это ошибка, и я создал билет Jira: jira.spring.io/browse/SPR-11949
Ответ №1:
Как вы сами выяснили, это действительно ошибка, и она устранена в следующих 4.0.6
и 4.1.RC1
. Спасибо!