0

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)

  • What Spring Integration version do you use? May we also see a Stack Trace for those bad requests? I wonder how JMS Gateway reacts to missed `replyTo` header. Of course, it would be great to have the whole use-case to let us to play and reproduce an issue... – Artem Bilan Mar 28 '18 at 13:48
  • grammar; layout. – rene Mar 28 '18 at 17:31
  • A stacktrace would be helpful. – kjp Mar 29 '18 at 18:06
  • @ArtemBilan - I have edited original question and have added exception stack trace too... Please take a look... – Mahesh Jadhav Apr 05 '18 at 11:22
  • FYI... I have also tried tweaking default "recoveryInterval" period of 5 sec, but had no luck :(... – Mahesh Jadhav Apr 05 '18 at 11:23
  • @ArtemBilan - did you get a chance to look into it? – Mahesh Jadhav Apr 10 '18 at 09:15
  • That’s too old Spring Integration version. It’s out of support already. Would be great to see how it works on the latest: https://projects.spring.io/spring-integration/. At least 4.3.15 – Artem Bilan Apr 10 '18 at 11:41
  • thanks! would be great if you can try out given scenario to validate the behavior i.e. test with mix set of requests over MQ (one is bad request i.e. not having replyTo header and other one with all the details)? Also, are there any changes the way DMLC handles recovery in such scenarios (i.e. JMS exceptions) in given version 4.3.15 from 3.1.2? – Mahesh Jadhav Apr 10 '18 at 14:27

0 Answers0