No se pudo confirmar la transacción JMS porque la sesión está cerrada
Frecuentes
Visto 6,084 veces
1
En marzo, actualizamos nuestro websphere mq de la versión 6 a la 7. Desde que hicimos esto, cada mes se pierde una transacción mientras nuestra aplicación intenta colocar un mensaje en una cola de MQ. Obtenemos este error:
[8/1/12 11:37:53:163 MEST] 00000361 LocalTranCoor E WLTC0016E: No se pudo completar el recurso JMS$QueueConnectionFactory$JMSManagedConnection@1276. El seguimiento de la pila de excepciones es el siguiente: javax.transaction.xa.XAException en com.ibm.ejs.j2c.LocalTransactionWrapper.commit(LocalTransactionWrapper.java:283) en com.ibm.ws.LocalTransaction.LocalTranCoordImpl.complete(LocalTranCoordImpl.java:942) en com.ibm.ws.LocalTransaction.LocalTranCoordImpl.complete(LocalTranCoordImpl.java:830) en com.ibm.ws.LocalTransaction.LocalTranCoordImpl.end(LocalTranCoordImpl.java:1424) en com.ibm.ejs.csi.TranStrategy.commit (TranStrategy.java:891) en com.ibm.ejs.csi.TranStrategy.postInvoke(TranStrategy.java:230) en com.ibm.ejs.csi.NotSupported.postInvoke(NotSupported.java:133) en com.ibm. ejs.csi.TransactionControlImpl.postInvoke(TransactionControlImpl.java:570) en com.ibm.ejs.container.EJSContainer.postInvoke(EJSContainer.java:4558) en com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java: 111) en com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java:136) en com.ibm.ejs.jms.listener.ServerSession.run(ServerSession.java:567) en com.ibm.ws.util .ThreadPool$Trabajo r.run(ThreadPool.java:1604) Provocado por: javax.resource.spi.ResourceAdapterInternalException: no se pudo confirmar la transacción en com.ibm.ejs.jms.JMSCMUtils.mapToResourceException(JMSCMUtils.java:176) en com.ibm.ejs .jms.JMSManagedSession$JMSLocalTransaction.commit(JMSManagedSession.java:1209) en com.ibm.ejs.j2c.LocalTransactionWrapper.commit(LocalTransactionWrapper.java:263) ... 12 más Causado por: com.ibm.msg.client. jms.DetailedIllegalStateException: JMSCC0020: esta sesión está cerrada. Una aplicación llamó a un método que no debe usarse después de cerrar la sesión. Asegúrese de que la sesión no esté cerrada antes de llamar al método. en sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) en sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) en sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) en java.lang.reflect.Constructor .newInstance(Constructor.java:513) en com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:313) en com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices .java:388) en com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:104) en com.ibm.msg.client.jms.internal.State.checkNotClosed(State.java:145 ) en com.ibm.msg.client.jms.internal.JmsSessionImpl.checkNotClosed(JmsSessionImpl.java:2479) en com.ibm.msg.client.jms.internal.JmsSessionImpl.commit(JmsSessionImpl.java:516) en com. ibm.mq.jms.MQSession.commit(MQSession.java:214) en com.ibm.ejs.jms.JMSManagedSession$JMSLocalTransaction.commit(JMSManagedSession.java:1203 13) ... XNUMX más .
Nuestra aplicación no está diseñada para manejar la acción de reversión, por lo que el mensaje se pierde. Me gustaría saber qué está causando este problema desde la actualización y qué podemos hacer al respecto.
El código java que estamos usando es:
public void sendMessage(QueueConnectionFactory connectionFactory, Queue queue, String text, int priority) throws JMSException{
QueueConnection connection = null;
try {
connection = connectionFactory.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage(text);
sender.send(message);
} finally {
if (connection!=null)
connection.close();
}
}
Saludos.
tom
Si sucede solo una vez al mes, ¿hay algo sobre el mensaje que debamos saber antes de intentar adivinar la causa? Los detalles de su excepción indican (para mí) que el problema ocurre en el envío posterior (¿posiblemente generación de reconocimiento?). Está intentando cerrar una conexión inmediatamente después de enviar(). Por cierto: agregar un poco de manejo de errores en su código anterior también podría ayudar. - Germann Arlington
No hay nada especial en el mensaje. Diariamente manejamos 100000 mensajes con el mismo formato. No podemos encontrar ninguna similitud entre los momentos en que recibimos este error. No he sido capaz de recrearlo también. Por lo tanto, es difícil averiguar qué es lo que realmente está causando este problema. - TomVerkest
Como mencioné, agregar algo de manejo de errores (registro) en su código anterior puede ayudarlo. 1) ¿Son válidos los mensajes que dan como resultado un error? ¿Son considerablemente más largos que el promedio? ¿Tienen dependencias circulares? La lista de posibles causas es casi interminable. - Germann Arlington
De hecho, es una larga lista de posibles causas. Lo he estado buscando durante mucho tiempo y no puedo encontrar ninguna razón por la que se pierda 1 mensaje en esos millones. El error se detecta y el registro que obtengo se puede leer en mi pregunta anterior. El código funcionó durante varios años sin problemas, pero desde que actualizamos a MQ v7 hemos perdido unos 10 mensajes en 7 meses. Siempre está en un momento ocupado con muchos mensajes entrantes. Pero tenemos 4 de esos momentos ocupados cada día. - TomVerkest
Hola, estamos enfrentando un problema similar. ¿Puedes compartir la solución (si la hay)? - user1588737