2011-07-27 4 views
6

Tengo un MDB en WebSphere 6. El MessageListener está vinculado a una cola Tibco EMS. En el MDB, intento escribir en una cola de WebSphere MQ. Me sale el siguiente error:Un intento ilegal de comprometer un recurso capaz de una fase con recursos existentes con capacidad de dos fases

WMSG0042I: MDB Listener LoanIQ Payments Inbound started successfully for JMSDestination jms/eid/payments 
WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred. 
WTRN0086I: XAException encountered during prepare phase for transaction 00000131...0001. Local resources follow. 
WTRN0089I: [email protected] 3fbe3fbe XAResource: [email protected] enlisted: true mcWrapper.hashCode()1038237154: Vote: commit. 
WTRN0089I: [email protected]:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS [email protected] enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none. 

La instancia QueueConnectionFactory es un com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. ¿Podría obtener una XAConnection de esto? ¿Realmente necesito? Prefiero quedarme con el JMS de vainilla si es posible.

La implementación de MDB es similar a:

public void onMessage(Message message) { 
    // ^^ incoming message delivered from EMS queue via WAS MessageListener 
    TextMessage textMessage = (TextMessage) message; 
    QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup(factoryName); 
    Queue queue = (Queue) context.lookup(queueName); 
    QueueConnection connection = factory.createQueueConnection(); 
    connection.start(); 
    QueueSession session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 
    QueueSender sender = session.createSender(queue); 
    TextMessage message = session.createTextMessage("some new payload"); 
    sender.send(message); 
    // ^^ outgoing message sent to WebSphere MQ queue 
} 

Respuesta

7

Mirando el error, tiene un recurso XA y uno JCA LocalTransaction

WTRN0089I: [email protected] 3fbe3fbe XAResource: [email protected] enlisted: true mcWrapper.hashCode()1038237154: Vote: commit.

y

WTRN0089I: [email protected]:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS [email protected] enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none.

suena como usted cualquiera no ha configurado ConnectionFactory a XA habilitado, consulte:

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/umj_pjcfm.html

(vaya a "XA habilitado") o la conexión TIBCO EMS no es capaz XA. Si es el último, y no hay un controlador XA adecuado, entonces podría consultar el soporte de Last-Participant en el infocentro WAS, que podría hacer lo que necesita, es decir, WAS prepararía la transacción WMQ XA, comprometería localmente el Tibco y luego comprometería WMQ si el commit de Tibco funcionó (o rollback de lo contrario). Si la conexión de Tibco es compatible con XA, WAS tiene soporte XA completo para WMQ integrado, por lo que no hay ninguna razón para no utilizar una transacción de dos fases para toda la operación.

En cuanto

The QueueConnectionFactory instance is a com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle. Could I get an XAConnection from this? Do I need to? I'd prefer to stay with vanilla JMS if possible.

No deberías hacer esto, sólo sigue a JMS de civil. Como un punto general de estilo, es mejor enviar contenido a ConnectionFactory (no QueueConnectionFactory) también, y luego permanecer con objetos entre dominios (Connection, Session, MessageProducer).

+2

MQ estaba habilitado para XA. Parece que los controladores EMS no lo eran. [Habilitando LPS] (https://www.ibm.com/developerworks/wikis/display/xdcomputegrid/Enabling+last+participant+support) funcionó. Gracias. – Synesso

+0

El enlace para habilitar LPS se encuentra aquí. http://www-01.ibm.com/support/docview.wss?uid=swg21244805 – asgs

1

Tuve el mismo problema. He configurado mi Queue, QCF y AC, pero después de recibir el mensaje, la transacción se retrotrae y la actualización de la base de datos también falla. He añadido @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) en el método onMessage.

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public void onMessage(Message message) {//Logic } 

Espero que ayude a alguien. El mío es WAS 7 con MDB para escuchar el mensaje.

`

Cuestiones relacionadas