We are using below mentioned spring integration jms inbound gateway to listen and read message from mq, processing same, and responding back to replyTo mq.
However, we have been observing Session Close exceptions while processing concurrent requests. It is observed that few of the requests are bad (i.e. not carrying replyTo header) resulting in some exception which is affecting processing of other good requests i.e. resulting in exception of Session Closed while sending reply.
<jms:inbound-gateway request-channel="inputChannel" error-channel="errorChannel"
container="channelContainer"/>
<bean id="channelContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="getQueue" />
<property name="concurrentConsumers" value="10" />
<property name="autoStartup" value="true" />
</bean>
It looks, spring integration DMLC does have provision to recover listener setup failure in case of any exception. But, it doesn't seem to be consistent for concurrent requests and affecting good requests too.
Please suggest.
Note - I have tried setting value of exposeListenerSession to false which seems to be solving given issue, but it looks creating given resources every time irrespective of exception.
I am more looking for some solution which will refresh or reestablish given resources in case of exception only. We are using spring 3.1.2 release and 2.2.0 version of spring-integration.
Below is exception stack trace -
[18-Mar-19 10:49:55,289][org.springframework.jms.listener.DefaultMessageListenerContainer#0-20:INFO][DefaultMessageListenerContainer:875] Successfully refreshed JMS Connection [18-Mar-19 10:49:55,290][org.springframework.jms.listener.DefaultMessageListenerContainer#0-17:DEBUG][DefaultMessageListenerContainer:823] Setup of JMS message listener invoker failed - already recovered by other invoker javax.jms.InvalidDestinationException: Cannot determine reply destination: Request message does not contain reply-to destination, and no default reply destination set. at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.getReplyDestination(ChannelPublishingJmsMessageListener.java:361) at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.onMessage(ChannelPublishingJmsMessageListener.java:282) at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:537) at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:497) at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:326) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960) at java.lang.Thread.run(Thread.java:798) [18-Mar-19 10:49:55,290][org.springframework.jms.listener.DefaultMessageListenerContainer#0-16:DEBUG][DefaultMessageListenerContainer:823] Setup of JMS message listener invoker failed - already recovered by other invoker com.ibm.msg.client.jms.DetailedIllegalStateException: JMSCC0032: This message consumer is closed. An application called a method that must not be used after the message consumer is closed. Ensure that the message consumer is not closed before calling the method. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:86) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:58) at java.lang.reflect.Constructor.newInstance(Constructor.java:542) at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:314) at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:228) at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:104) at com.ibm.msg.client.jms.internal.State.checkNotClosed(State.java:145) at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receive(JmsMessageConsumerImpl.java:428) at com.ibm.mq.jms.MQMessageConsumer.receive(MQMessageConsumer.java:212) at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:553) at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:501) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:431) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:311) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960) at java.lang.Thread.run(Thread.java:798) [18-Mar-19 10:49:55,290][org.springframework.jms.listener.DefaultMessageListenerContainer#0-12:DEBUG][DefaultMessageListenerContainer:823] Setup of JMS message listener invoker failed - already recovered by other invoker com.ibm.msg.client.jms.DetailedIllegalStateException: JMSCC0032: This message consumer is closed. An application called a method that must not be used after the message consumer is closed. Ensure that the message consumer is not closed before calling the method. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:86) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:58) at java.lang.reflect.Constructor.newInstance(Constructor.java:542) at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:314) at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:228) at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:104) at com.ibm.msg.client.jms.internal.State.checkNotClosed(State.java:145) at com.ibm.msg.client.jms.internal.JmsMessageConsumerImpl.receive(JmsMessageConsumerImpl.java:428) at com.ibm.mq.jms.MQMessageConsumer.receive(MQMessageConsumer.java:212) at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:553) at com.ibm.ejs.jms.JMSMessageConsumerHandle.receive(JMSMessageConsumerHandle.java:501) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:431) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:311) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960) at java.lang.Thread.run(Thread.java:798) [18-Mar-19 10:49:55,290][org.springframework.jms.listener.DefaultMessageListenerContainer#0-11:DEBUG][DefaultMessageListenerContainer:823] Setup of JMS message listener invoker failed - already recovered by other invoker javax.jms.IllegalStateException: Session closed at com.ibm.ejs.jms.JMSSessionHandle.getOpenSession(JMSSessionHandle.java:1311) at com.ibm.ejs.jms.JMSSessionHandle.getOpenUnifiedSession(JMSSessionHandle.java:1349) at com.ibm.ejs.jms.JMSSessionHandle.getTransacted(JMSSessionHandle.java:617) at org.springframework.jms.listener.AbstractMessageListenerContainer.rollbackOnExceptionIfNecessary(AbstractMessageListenerContainer.java:605) at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:471) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:326) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960) at java.lang.Thread.run(Thread.java:798)