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)