为什么在将客户端JBoss连接回收到远程队列之后仍然抛出SpyJMSExceptionexception?

我的应用程序在JBoss 7.2.0系统上作为客户端与JBoss 4.2.1系统上的接收者JNDI / JMS进行通信。 它创build一个发送队列和一个接收队列。 这个configuration我们已经连续运行了两个月。 双方都没有改变。 本地客户端应用程序安装了4.2.1 jbossall-client.jar和jnp-client.jars。

在正常的活动之后,我们开始接收一个org.jboss.mq.SpyJMSException: Exiting on IOE; - nested throwable: (java.io.EOFException) at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72) org.jboss.mq.SpyJMSException: Exiting on IOE; - nested throwable: (java.io.EOFException) at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72)exception。

我们重新启动了JBoss 7.2.0而不做任何改变,当我们build立接收队列时,我们现在正在接收一个org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; {...} Caused by: java.io.EOFException org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; {...} Caused by: java.io.EOFException在我们的QueueReceiver receiver = session.createReceiver(queue);代码抛出org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; {...} Caused by: java.io.EOFExceptionexceptionQueueReceiver receiver = session.createReceiver(queue); 。 我们也开始抛出这个例外后,应用程序运行良好的天,但没有连接多天的时间。

我们重新启动了4.2.1系统,看看是不是这个问题,但是没有修复。 事实上,我们可以通过使两个系统正常连接来复制这种故障情况,然后回收4.2.1系统。 一旦4.2.1系统closures,错误就开始抛出,7.2.1系统一旦4.2.1系统完全build立(甚至当它应该能够这样做)时,7.2.0系统仍然不能重新build立连接。

停止然后在JBoss中启动应用程序不会解决这个问题。 重新启动JBoss有20%的机会修复这个问题(在上面引用的强制故障情况下,有100%的机会)。 取消部署,然后重新部署应用程序通常会修复此问题。

什么可能导致这个?

这个war文件在我们的testing系统上工作得很好,它有一个相同的JBoss设置。 使用相同的代码通过命令提示符通过testing应用程序与目标JBoss系统进行通信可以正常工作。

我怀疑JBoss 7.2.0本身存在问题,或者这可能是一个超时问题? 如何检查或延长超时时间; 客户端可以做些什么吗? 即使超时,我在start()的其他部分重新连接之前先调用stop()方法,但仍然得到exception; 在这种情况下,它不会是超时问题,因为超时会重置。

上下文值:

 connectionFactoryName=ConnectionFactory contextFactoryName=org.jnp.interfaces.NamingContextFactory packagePrefixes=org.jboss.naming:org.jnp.interfaces providerUrl=MYSERVER:1099 

Java代码:

 private ContextContainer contextContainer = null; private QueueConnection connection = null; private QueueReceiver receiver = null; private Queue sendQueue = null; private Queue receiveQueue = null; private String sendQueueName = null; private String receiveQueueName = null; private MessageHandler messageHandler = null; protected synchronized void start() throws Exception { // NOTE: This position also has delay code (for pending multiple // consecutive recycling requests), with an external method to // reset the delay. It was removed for code clarity and has no // effect on the issue being discussed. // Clear prior Connection stop(); logger.info("Regenerating JMS for : " + this.getClass().getName()); Context context = this.contextContainer.getContext(); logger.info("Looking up factory : " + contextContainer.getConnectionFactoryName()); QueueConnectionFactory connectionFactory = (QueueConnectionFactory)context.lookup(contextContainer.getConnectionFactoryName()); // ESTABLISH SEND MESSAGE QUEUE logger.info("Looking up send queue : " + sendQueueName); sendQueue = (Queue)context.lookup(sendQueueName); logger.info("Send Queue string : " + sendQueue); logger.info("Send Queue name : " + sendQueue.getQueueName()); logger.info("Creating Queue Connection"); connection = connectionFactory.createQueueConnection(); logger.info("Setting Exception Listener"); connection.setExceptionListener(new ExceptionListener() { public void onException(JMSException ex) { logger.error("JMS Exception received on QueueConnection", ex); start(); } }); // ESTABLISH RECEIVE MESSAGE QUEUE logger.info("Looking up receive queue : " + receiveQueueName); receiveQueue = (Queue)context.lookup(receiveQueueName); logger.info("Receive Queue string : " + receiveQueue); logger.info("Receive Queue name : " + receiveQueue.getQueueName()); logger.info("Creating JMS Session for Receiving"); QueueSession session = connection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); logger.info("Created Session " + session); logger.info("Creating JMS Receiver for Queue \"" + receiveQueue.getQueueName() + "\""); // THIS IS THE LINE WHERE THE EXCEPTION IS THROWN!!! receiver = session.createReceiver(receiveQueue); logger.info("Setting Message Listener"); receiver.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { if (message instanceof ObjectMessage) { Object obj = ((ObjectMessage) message).getObject(); // UNRELATED METHOD FOR HANDLING THE MESSAGE handleMessage(obj); } else { throw new Exception("Received message of unexpected type " + message.getJMSType() + ", was expecting ObjectMessage"); } } catch (Exception ex) { logger.error("Error processing incoming message.", ex); } finally { try { message.acknowledge(); logger.info("Acknowledged message."); } catch (Exception ex) { logger.error("Unable to acknowledge message.", ex); } } } }); logger.info("Starting Queue Connection"); connection.start(); logger.info("Started Queue Connection"); } /** * Extinguish the existing connection. */ public synchronized void stop() { if (receiver != null) { try { logger.info("Nullifying Receiver Listener"); receiver.setMessageListener(null); logger.info("Nullified Receiver Listener"); } catch(Exception ex) { logger.warn("Exception nullifying Receiver Listener", ex); } try { logger.info("Closing Receiver"); receiver.close(); logger.info("Closed Receiver"); } catch(Exception ex) { logger.warn("Exception closing Receiver", ex); } finally { receiver = null; } } if (connection != null) { try { logger.info("Nullifying Exception Listener"); connection.setExceptionListener(null); logger.info("Nullified Exception Listener"); } catch (Exception ex) { logger.warn("Exception nullifying Exception Listener", ex); } try { logger.info("Stopping Queue Connection"); connection.stop(); logger.info("Stopped Queue Connection"); } catch (Exception ex) { logger.warn("Exception stopping Queue Connection", ex); } try { logger.info("Closing Queue Connection"); connection.close(); logger.info("Closed Queue Connection"); } catch (Exception ex) { logger.warn("Exception closing Queue Connection", ex); } finally { connection = null; } } } 

日志输出:

 Setting Context Factory Class: org.jnp.interfaces.NamingContextFactory Setting Package Prefixes: org.jboss.naming:org.jnp.interfaces Setting Provider URL: MYSERVER:1099 Generating JMS for : MYPACKAGE.ConnectionHandler Looking up factory : ConnectionFactory Looking up send queue : queue/sendQueue Send Queue string : QUEUE.sendQueue Send Queue name : sendQueue Creating Queue Connection Setting Exception Listener Looking up receive queue : queue/receiveQueue Receive Queue string : QUEUE.receiveQueue Receive Queue name : receiveQueue Creating JMS Session for Receiving Created Session SpySession@1903462020[tx=false ack=CLIENT txid=null RUNNING connection=Connection@1963631553[token=ConnectionToken:ID:273725/9966a9625bb094d33a37f72db71b3bb9 rcvstate=STOPPED]] Creating JMS Receiver for Queue "receiveQueue" Exception caught during initialization. org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; - nested throwable: (java.io.EOFException) 

正常活动后的exception追踪:

 JMS Exception received on QueueConnection org.jboss.mq.SpyJMSException: Exiting on IOE; - nested throwable: (java.io.EOFException) at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72) at org.jboss.mq.Connection.asynchFailure(Connection.java:423) at org.jboss.mq.il.uil2.UILClientILService.asynchFailure(UILClientILService.java:174) at org.jboss.mq.il.uil2.SocketManager$ReadTask.handleStop(SocketManager.java:439) at org.jboss.mq.il.uil2.SocketManager$ReadTask.run(SocketManager.java:371) at java.lang.Thread.run(Thread.java:744) Caused by: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2766) at java.io.ObjectInputStream.readByte(ObjectInputStream.java:916) at org.jboss.mq.il.uil2.SocketManager$ReadTask.run(SocketManager.java:316) ... 1 more 

重启后的exception追踪:

 org.jboss.mq.SpyJMSException: Cannot subscribe to this Destination: ; - nested throwable: (java.io.EOFException) at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72) at org.jboss.mq.SpyJMSException.rethrowAsJMSException(SpyJMSException.java:57) at org.jboss.mq.Connection.addConsumer(Connection.java:800) at org.jboss.mq.SpySession.addConsumer(SpySession.java:947) at org.jboss.mq.SpySession.createReceiver(SpySession.java:658) at org.jboss.mq.SpyQueueSession.createReceiver(SpyQueueSession.java) at org.jboss.mq.SpySession.createReceiver(SpySession.java:647) at org.jboss.mq.SpyQueueSession.createReceiver(SpyQueueSession.java) at MYPACKAGE.ConnectionHandler.start(ConnectionHandler.java:144) at MYPACKAGE.ConnectionHandler.initialize(ConnectionHandler.java:60) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1414) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1375) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380) at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3339) at org.apache.catalina.core.StandardContext.start(StandardContext.java:3777) at org.jboss.as.web.deployment.WebDeploymentService.doStart(WebDeploymentService.java:156) at org.jboss.as.web.deployment.WebDeploymentService.access$000(WebDeploymentService.java:60) at org.jboss.as.web.deployment.WebDeploymentService$1.run(WebDeploymentService.java:93) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) at org.jboss.threads.JBossThread.run(JBossThread.java:122) Caused by: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.readByte(ObjectInputStream.java:2766) at java.io.ObjectInputStream.readByte(ObjectInputStream.java:916) at org.jboss.mq.il.uil2.SocketManager$ReadTask.run(SocketManager.java:316) at java.lang.Thread.run(Thread.java:744) 

正如问题所述,JBoss 4.2.1服务器已经升级到7.1.1 Final。 升级已经解决了这个问题,客户现在按预期工作,但不幸的是,这个解决scheme并没有解释这个问题。