2009-02-05 18 views
7

Tengo un proceso que implica el envío de un mensaje JMS. El proceso es parte de una transacción. Si falla una parte posterior de la transacción, una parte posterior a una parte anterior que envió el mensaje, necesito cancelar el mensaje. Lo único que pensé fue configurar el mensaje de alguna manera para que no se recogiera durante un cierto período de tiempo, y si necesito deshacerlo, podría ir y cancelar el mensaje. Si no conozco los mensajes, no sé si la idea es posible. O, ¿hay una mejor idea? GraciasJMS rollback

Respuesta

7

Puede usar JMS y JTA (Java Transaction API) al mismo tiempo - see here. Al hacer eso, el envío de un mensaje JMS o el consumo de un mensaje recibido sucede de manera atómica como parte de la confirmación de transacción.

¿Qué significa esto? Si la transacción falla o se revierte, el mensaje "enviado" no se apaga y los mensajes "recibidos" no se consumen realmente. Todo gestionado para usted por su proveedor JMS y JTA.

Debe utilizar una implementación JMS que admita JTA. Parece que ya está usando transacciones, por lo que podría ser una cuestión de hacer alguna configuración para que esto suceda (agitando la mano vigorosamente ...).

He tenido experiencia al usar esto (BEA WebLogic 7 con BEA WebLogic Integration). Funcionó como se anuncia: "el mundo exterior" no vio el impacto de las cosas de JMS que probé a menos que la transacción se haya realizado correctamente.

8

Lo que ha descrito es una transacción XA. Esto permite que una transacción abarque múltiples capas, es decir, proveedor JMS, DB o cualquier otro EIS. La mayoría de los contenedores pueden configurarse para usar transacciones que no sean XA y ninguna transacción XA, así que verifique la configuración de su contenedor.

Por ejemplo, si está utilizando JMS con transacciones XA, es posible lo siguiente.

Start Transaction 
     | 
    DB Insert 
     | 
    Send JMS Msg 
     | 
    More DB Inserts 
     | 
    Commit Transaction <- Only at this point will the database records be inserted and the JMS message sent. 

XA tranactions sólo están disponibles en contenedores llenos de Java EE por lo transacciones XA no están disponibles en Tomcat.

¡Buena suerte!

Karl

+0

También tener en cuenta el gasto de recursos: http://stackoverflow.com/questions/12305900/performance-overhead-of-xa-data-sources-best-practices – Vadzim