|
RSS Feed - WebSphere MQ Support
|
RSS Feed - Message Broker Support
|
 |
|
How to clear MQ channel when Tomcat container is bounced |
« View previous topic :: View next topic » |
Author |
Message
|
markg |
Posted: Tue Sep 26, 2006 2:21 pm Post subject: How to clear MQ channel when Tomcat container is bounced |
|
|
Newbie
Joined: 26 Sep 2006 Posts: 3
|
Hello,
I am making asynchronous calls via Lingo using lingo-1.0-SNAPSHOT.jar in the application run on Tomcat.
<bean id="stagingManagerServer"
class="org.logicblaze.lingo.jms.JmsServiceExporter">
<property name="service">
<ref bean="stagingManagerService" />
</property>
<property name="serviceInterface"
value="org.tiaa.scm.tool.service.IStagingManager" />
<property name="connectionFactory">
<ref bean="jmsQueueConnectionFactory" />
</property>
<property name="destination">
<ref bean="jmsDestination"/>
</property>
</bean>
<bean id="stagingManagerClient"
class="org.logicblaze.lingo.jms.JmsProxyFactoryBean">
<property name="serviceInterface"
value="org.tiaa.scm.tool.service.IStagingManager" />
<property name="connectionFactory">
<ref bean="jmsQueueConnectionFactory" />
</property>
<property name="destination">
<ref bean="jmsDestination"/>
</property>
<property name="remoteInvocationFactory" ref="invocationFactory" />
</bean>
<bean id="invocationFactory"
class="org.logicblaze.lingo.LingoRemoteInvocationFactory">
<constructor-arg>
<bean class="org.logicblaze.lingo.SimpleMetadataStrategy">
<property name="oneWayForVoidMethods" value="true" />
</bean>
</constructor-arg>
</bean>
My problem is that when the container is bounced lingo does not always close open MQ queue and does not delete temporary queue (see exceptions attached).
Any clues would be greatly appreciated.
Thanks,
Mark
=======================================================
ERROR - Destroy method on bean with name 'stagingManagerServer' threw an exception
javax.jms.JMSException: MQJMS2000: failed to close MQ queue
at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:567)
at com.ibm.mq.jms.MQMessageConsumer.closeQ(MQMessageConsumer.java:1265)
at com.ibm.mq.jms.MQQueueReceiver.close(MQQueueReceiver.java:137)
at org.logicblaze.lingo.jms.JmsServiceExporter.destroy(JmsServiceExporter.java:75)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.destroy(AbstractBeanFactory.java:924)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1020)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroySingletons(AbstractBeanFactory.java:561)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:512)
at org.springframework.web.struts.ContextLoaderPlugIn.destroy(ContextLoaderPlugIn.java:390)
at org.apache.struts.action.ActionServlet.destroyModules(ActionServlet.java:499)
at org.apache.struts.action.ActionServlet.destroy(ActionServlet.java:286)
at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1331)
at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1666)
at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:892)
at org.apache.catalina.core.StandardContext.removeChild(StandardContext.java:3095)
at org.apache.catalina.startup.ContextConfig.stop(ContextConfig.java:1082)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:276)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4355)
at org.apache.catalina.manager.ManagerServlet.stop(ManagerServlet.java:1226)
at org.apache.catalina.manager.HTMLManagerServlet.stop(HTMLManagerServlet.java:545)
at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
2006.09.25 11:39:42 MQJMS1023E rollback failed
ERROR - Destroy method on bean with name 'stagingManagerClient' threw an exception
javax.jms.JMSException: MQJMS3004: failed to delete temporary queue
at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:567)
at com.ibm.mq.jms.MQTemporaryQueue.delete(MQTemporaryQueue.java:196)
at org.logicblaze.lingo.jms.impl.SingleThreadedRequestor.close(SingleThreadedRequestor.java:83)
at org.logicblaze.lingo.jms.JmsClientInterceptor.destroy(JmsClientInterceptor.java:127)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.destroy(AbstractBeanFactory.java:924)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1020)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyBean(AbstractBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroyDisposableBean(AbstractBeanFactory.java:992)
at org.springframework.beans.factory.support.AbstractBeanFactory.destroySingletons(AbstractBeanFactory.java:561)
at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:512)
at org.springframework.web.struts.ContextLoaderPlugIn.destroy(ContextLoaderPlugIn.java:390)
at org.apache.struts.action.ActionServlet.destroyModules(ActionServlet.java:499)
at org.apache.struts.action.ActionServlet.destroy(ActionServlet.java:286)
at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1331)
at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1666)
at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:892)
at org.apache.catalina.core.StandardContext.removeChild(StandardContext.java:3095)
at org.apache.catalina.startup.ContextConfig.stop(ContextConfig.java:1082)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:276)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4355)
at org.apache.catalina.manager.ManagerServlet.stop(ManagerServlet.java:1226)
at org.apache.catalina.manager.HTMLManagerServlet.stop(HTMLManagerServlet.java:545)
at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
INFO - Closing Spring root WebApplicationContex  |
|
Back to top |
|
 |
jefflowrey |
Posted: Tue Sep 26, 2006 2:25 pm Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
If you're using MQ v6, you should be able to find the still-open connection on the temporary queue using dis qstatus type(handle) and then forcing the connection closed (stop connection). _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
markg |
Posted: Tue Sep 26, 2006 2:43 pm Post subject: |
|
|
Newbie
Joined: 26 Sep 2006 Posts: 3
|
Jeff,
Thanks a lot for your quick reply. It seems like I will have to close all open MQ connections manually every time I bounce Tomcat. Is that correct?
Is there a way to setup container to take care of MQ connections automatically when a bounce occurs?
Thanks,
Mark
 |
|
Back to top |
|
 |
fjb_saper |
Posted: Tue Sep 26, 2006 3:11 pm Post subject: |
|
|
 Grand High Poobah
Joined: 18 Nov 2003 Posts: 20756 Location: LI,NY
|
markg wrote: |
Jeff,
Thanks a lot for your quick reply. It seems like I will have to close all open MQ connections manually every time I bounce Tomcat. Is that correct?
Is there a way to setup container to take care of MQ connections automatically when a bounce occurs?
Thanks,
Mark
 |
No you should not have to sever any connection manually. This would point ot a network problem. I suspect, the root of the problem to be that your code handles poorly the exceptions in the finalizer/destroy method when trying to release the MQ resource. This should get called by the container on all objects (beans) after the stop request and before it enters the stopped state.
You may try to close the resources in the right serial order producers, stop connections, listeners, consumers, sessions, close connections but you have them all in just one try catch block.
Each resource you are trying to close will need its own try catch finally block. So that when an exception is being thrown at close of consumer you still close the session and the connection.
Now if you do a hard bounce and just kill the JVM, Jeff's method may be the only way to
reclaim abandoned resources
Enjoy
 _________________ MQ & Broker admin |
|
Back to top |
|
 |
markg |
Posted: Wed Sep 27, 2006 11:28 am Post subject: |
|
|
Newbie
Joined: 26 Sep 2006 Posts: 3
|
As you can see from my post, I do not handle MQ-related issue in the code at all. Everything is done declaratively via Spring beans in the applicationContext.xml. In that case Lingo, Spring remoting imlplementation handles everything for me when server and client beans are initialized, and a method is executed on the client and a message is sent to the queue of the service implementation. There's no clearing down. Then replies are by default sent to a temporary queue - which is destroyed by the JMS provider if the client dies.
My problem is that when the container is bounced lingo does not always close open MQ queue and does not delete temporary queue (see exceptions attached).
Mark
 |
|
Back to top |
|
 |
jefflowrey |
Posted: Wed Sep 27, 2006 12:31 pm Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
Sounds like a bug in Lingo. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
|
|
 |
|
Page 1 of 1 |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|