Spring Framework 5.3.39: javax.jms.IllegalStateException при отправке сообщения с помощью jmstemplate в IBM Websphere 9JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Framework 5.3.39: javax.jms.IllegalStateException при отправке сообщения с помощью jmstemplate в IBM Websphere 9

Сообщение Anonymous »

У меня возникла проблема при переходе с Spring 4.3.5 на 5.3.39 (я знаю, что поддержка этих версий сообществом прекращена, но мне нужно изучить проблему).
Мое приложение работает на IBM WebSphere 9 (JVM 8, поэтому Spring 5.3.39 — самая последняя версия, на которую я могу перейти) и использует JmsTemplate для отправки сообщений в очередь IBM MQ. Для параметра sessionTransacted установлено значение true, в Spring 4.3.5 все работает нормально, а в версии 5.3.39 я получаю исключение IllegalStateException с этой трассировкой стека:

Код: Выделить всё

Caused by: javax.jms.IllegalStateException: Method not permitted in global transaction
null
at com.ibm.ejs.jms.JMSSessionHandle.checkNotInGlobalTransaction(JMSSessionHandle.java:1385)
at com.ibm.ejs.jms.JMSSessionHandle.commit(JMSSessionHandle.java:700)
at com.ibm.ejs.jms.JMSSessionHandle.commit(JMSSessionHandle.java:663)
at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:218)
at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:1278)
at org.springframework.jms.core.JmsTemplate.lambda$send$3(JmsTemplate.java:586)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:504)
at orgmsTemplate.send(JmsTemplate.java:584)
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:661)
at it.[REDACTED].sendMessage[REDACTED].java:839)
at it.[REDACTED].java:156)
at it.[REDACTED].java:63)
at it.[REDACTED].java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
В моем сценарии транзакция управляется контейнером сервера приложений. Однако в Spring 5.3.39 класс JmsUtils был изменен, и из commitIfNecessary был удален следующий блок:

Код: Выделить всё

catch (IllegalStateException illegalStateException) {}
Итак, исключение уже происходит в Spring 4.3.5, но платформа подавляет его, и все работает нормально.
Еще одна странность: согласно документации Spring (комментарий в коде), когда транзакция управляется контейнером, свойство sessionTransacted в JmsTemplate должно игнорироваться. Но на самом деле это не то, что происходит.
Во время отладки я обнаружил, что JmsTemplate.isSessionLocallyTransacted возвращает true, даже если в сеансе выполняются глобальные транзакции. Это происходит потому, что isSessionTransactional возвращает true из-за того, что TransactionSynchronizationManager.getResource(cf) возвращает значение null.
Посмотрев глубже в TransactionSynchronizationManager.getResource(cf), я заметил, что doGetResource возвращает значение null при получении карты из ресурсов:

Код: Выделить всё

TransactionSynchronizationManager.doGetResource
...
Map map = resources.get();
if (map == null) {
return null;
}
...
Это означает, что поток не знает о глобальной транзакции. Он пытается выполнить фиксацию, что в конечном итоге приводит к исключению.
У вас есть какие-либо предложения по этому поводу? Я впервые глубоко копаюсь в Spring Framework, поэтому, вероятно, что-то упускаю. Но я сейчас переношу сотни приложений, и это серьезная проблема.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -a-message
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»