Spring 4 CachingConnectionFactory с JMS 2.0 не кэширует должным образом производителей

#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 . Спасибо!