No se pudo confirmar la transacción JMS porque la sesión está cerrada

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

preguntado el 24 de agosto de 12 a las 09:08

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. -

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. -

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. -

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. -

Hola, estamos enfrentando un problema similar. ¿Puedes compartir la solución (si la hay)? -

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.