tutorial example español crear cola java exception jboss jms

español - java jms example



¿Por qué todavía se lanzan SpyJMSExceptions después de reciclar la conexión JBoss del cliente a las colas remotas? (1)

Como se señaló en la pregunta, el servidor JBoss 4.2.1 se ha actualizado a 7.1.1 Final. La actualización ha resuelto el problema y el cliente ahora funciona como se esperaba, pero desafortunadamente esta solución no explica el problema.

Mi aplicación a continuación se comunica como cliente en un sistema JBoss 7.2.0 a un receptor JNDI / JMS en un sistema JBoss 4.2.1. Crea una cola de envío y una cola de recepción. Hemos estado funcionando bien durante 2 meses seguidos con esta configuración; no se hicieron cambios a ninguno de los lados. La aplicación del cliente local tiene instalados 4.2.1 jbossall-client.jar y jnp-client.jars.

Después de la actividad normal, comenzamos a recibir una 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) excepción org.jboss.mq.SpyJMSException: Exiting on IOE; - nested throwable: (java.io.EOFException) at org.jboss.mq.SpyJMSException.getAsJMSException(SpyJMSException.java:72) .

Reiniciamos JBoss 7.2.0 sin cambiar nada, y cuando estamos estableciendo la cola de recepción, ahora estamos recibiendo una 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 excepción lanzada desde nuestro código en QueueReceiver receiver = session.createReceiver(queue); . También comenzamos a lanzar esta misma excepción después de que la aplicación haya estado funcionando bien durante días, pero sin actividad durante un período de varios días.

Reiniciamos el sistema 4.2.1 para ver si ese era el problema, pero eso no solucionó nada. De hecho, podemos replicar este escenario de falla haciendo que ambos sistemas se conecten normalmente, luego reciclar el sistema 4.2.1. Los errores comienzan a aparecer una vez que el sistema 4.2.1 está inactivo, y el sistema 7.2.0 continúa sin restablecer las conexiones una vez que el sistema 4.2.1 está completamente establecido (incluso cuando DEBE ser capaz de hacerlo).

Parar y luego iniciar la aplicación en JBoss no soluciona esto. Reiniciar JBoss tiene un 20% de posibilidades de arreglar esto (100% de posibilidades en el caso del escenario de falla forzada citado anteriormente). La eliminación de la implementación y la implementación de la aplicación generalmente solucionan esto.

Que podria estar causando esto?

Este mismo archivo war funciona bien en nuestro sistema de prueba, que tiene una configuración JBoss idéntica. La comunicación con el sistema JBoss de destino a través de una aplicación de prueba desde el símbolo del sistema con el mismo código funciona bien.

Sospecho que hay un problema con JBoss 7.2.0 en sí, ¿o es posiblemente un problema de tiempo de espera? ¿Cómo verifico o extiendo el tiempo de espera? ¿Es algo factible desde el lado del cliente? Incluso si era tiempo de espera, hago la llamada al método stop() antes de que el resto de start() vuelva a conectar, y todavía obtengo la excepción; en ese escenario, no sería un problema de tiempo de espera ya que un tiempo de espera se habría reiniciado.

Valores de contexto:

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

Código 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; } } }

Salida de registro:

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)

Seguimiento de excepción después de la actividad normal:

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

Seguimiento de excepción después de reiniciar:

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)