spring-projects / spring-framework

Spring Framework
https://spring.io/projects/spring-framework
Apache License 2.0
56.27k stars 37.99k forks source link

JmsTemplate/CachingConnectionFactory doesn't reset sessions if the underlying connection was physically closed - resetConnection is also not refreshing JMS session #26229

Closed ranganath2334 closed 1 year ago

ranganath2334 commented 3 years ago

Affects: \


Hi , The issue is similar to https://github.com/spring-projects/spring-framework/issues/22031

We are also facing the same issue with the combination JmsTemplate/CachingConnectionFactory. The stacktrace:

org.springframework.jms.IllegalStateException: JMSCC0020: This session is closed.; nested exception is com.ibm.msg.client.jms.DetailedIllegalStateException: JMSCC0020: This session is closed.
An application called a method that must not be used after the session is closed.
Ensure that the session is not closed before calling the method. for queue : queue:////<Queue name>>> 
    at com.chase.ccb.caf.core.service.api.io.jms.DefaultMessageListener.onMessage(DefaultMessageListener.java:86)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:761)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:699)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
    at java.lang.Thread.run(Thread.java:748)

we added the fix by explicitly calling CachingConnectionFactory#resetConnection in the catch block and retried sending the message When the exception "org.springframework.jms.IllegalStateException: JMSCC0020 This session is closed" occurred. But still the same exception occurred again

The issue of "org.springframework.jms.IllegalStateException: JMSCC0020 This session is closed." is occurring only intermittently

Spring JMS version is 5.2.7 IBM MQ 7.5.0.8 Spring-boot is 2.2.8.

there was an exception when it tried to close the connection: so, the connection was not closed and in the retry of sending message closed session was used and failed again.

stack_trace: com.ibm.msg.client.wmq.v6.jms.internal.ConfigEnvironment$1: MQJMS2000: failed to close MQ queue.
at com.ibm.msg.client.wmq.v6.jms.internal.ConfigEnvironment.newException(ConfigEnvironment.java:379)
at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageConsumer.closeQ(MQMessageConsumer.java:1135)
at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageConsumer.close(MQMessageConsumer.java:1069)
at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.close(JmsMessageConsumerImpl.java:266)
at com.ibm.msg.client.jms.internal.JmsSessionImpl.close(JmsSessionImpl.java:390)
at com.ibm.msg.client.jms.internal.JmsConnectionImpl.close(JmsConnectionImpl.java:305)
at com.ibm.mq.jms.MQConnection.close(MQConnection.java:98)
at org.springframework.jms.connection.SingleConnectionFactory.closeConnection(SingleConnectionFactory.java:501)
at org.springframework.jms.connection.SingleConnectionFactory.resetConnection(SingleConnectionFactory.java:389)
at org.springframework.jms.connection.CachingConnectionFactory.resetConnection(CachingConnectionFactory.java:205)
at org.springframework.jms.connection.SingleConnectionFactory.onException(SingleConnectionFactory.java:367)
at org.springframework.jms.connection.SingleConnectionFactory$AggregatedExceptionListener.onException(SingleConnectionFactory.java:721)
at com.ibm.msg.client.jms.internal.JmsProviderExceptionListener.run(JmsProviderExceptionListener.java:427)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.runTask(WorkQueueItem.java:214)
at com.ibm.msg.client.commonservices.workqueue.SimpleWorkQueueItem.runItem(SimpleWorkQueueItem.java:105)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueItem.run(WorkQueueItem.java:231)
at com.ibm.msg.client.commonservices.workqueue.WorkQueueManager.runWorkQueueItem(WorkQueueManager.java:303)
at com.ibm.msg.client.commonservices.j2se.workqueue.WorkQueueManagerImplementation$ThreadPoolWorker.run(WorkQueueManagerImplementation.java:1241)
Caused by: com.ibm.mq.MQException: Message catalog not found, completion=2, reason=2009
at com.ibm.msg.client.wmq.v6.base.internal.MQManagedObject.close(MQManagedObject.java:207)
at com.ibm.msg.client.wmq.v6.base.internal.MQQueue.close(MQQueue.java:360)
at com.ibm.msg.client.wmq.v6.jms.internal.MQMessageConsumer.closeQ(MQMessageConsumer.java:1127)
... 16 common frames omitted

Could you please help on this

Thanks

snicoll commented 1 year ago

I can see you've already added a comment on https://github.com/spring-projects/spring-framework/issues/22031 so let's keep the conversation in one place. A sample that we can run ourselves would be a good way to make progress.