Soporte de JTA
El soporte de API de transacción Java™ (JTA) proporciona interfaces de programación de aplicaciones (API) adicionales a la interfaz UserTransaction que está definida en la especificación JTA 1.1.
- Interfaz SynchronizationCallback
- Interfaz ExtendedJTATransaction
- Interfaz UOWSynchronizationRegistry
- Interfaz UOWManager
- Acceso a los identificadores de transacciones globales y locales asociados a la hebra.
El identificador global se basa en el identificador de transacción en el objeto CosTransactions::PropagationContext: y el identificador local identifica la transacción de manera exclusiva en la máquina virtual Java (JVM) local.
- Un proceso de retorno de llamada de sincronización de transacción que
cualquier componente de aplicación empresarial puede utilizar para registrar un interés en la finalización de
las transacciones.
Las aplicaciones avanzadas pueden utilizar esta devolución de llamada para deshacerse de las actualizaciones antes de que finalicen las transacciones y borrar el estado antes de que finalicen las transacciones. Habitualmente, las especificaciones Java EE (y relacionadas) colocan esta función como el dominio de los contenedores de aplicación de empresa.
Componentes tales como, por ejemplo, gestores de persistencia, adaptadores de recursos, enterprise beans y componentes de aplicaciones web pueden registrarse con una transacción JTA.
La siguiente información es una visión general de las interfaces que proporciona el soporte de JTA. Para obtener información detallada, consulte la documentación de la API generada.
Interfaz SynchronizationCallback
Un objeto que implemente esta interfaz figura listado una vez mediante la interfaz ExtendedJTATransaction y se le notifica cuando finaliza la transacción.
Aunque un objeto que implementa esta interfaz puede ejecutarse en una plataforma Java para un servidor de aplicaciones de empresa, no hay ningún componente de aplicación de empresa activo cuando se llama a este objeto. Por lo tanto, el objeto tiene un acceso directo limitado a los recursos de aplicación de empresa. Específicamente, el objeto no tiene acceso a java: namespace ni a ningún recurso que requiera la mediación de un contenedor. Un objeto de este tipo puede almacenar en la memoria caché una referencia a un componente de aplicación de empresa (por ejemplo, un bean de sesión sin estado) en el que está delegado. Entonces el objeto tendrá todo el acceso normal a los recursos de aplicación empresarial. Por ejemplo, puede utilizar el objeto para adquirir una conexión JDBC (Java Database Connectivity) y deshacerse de actualizaciones en una base de datos durante el método beforeCompletion.
Interfaz ExtendedJTATransaction
Esta interfaz es una extensión del modelo de programación de WebSphere para el soporte Java EE JTA. Un objeto que implemente esta interfaz está enlazado, mediante los contenedores de aplicación de empresa WebSphere Application Server, que dan soporte a esta interfaz, en java:comp/websphere/ExtendedJTATransaction. El acceso a este objeto, cuando se llama desde un contenedor de EJB (Enterprise JavaBeans), no está limitado a las transacciones gestionadas por componentes.
ExtendedJTATransaction exJTA = (ExtendedJTATransaction)ctx.lookup("
java:comp/websphere/ExtendedJTATransaction");
SynchronizationCallback sync = new SynchronizationCallback();
exJTA.registerSynchronizationCallback(sync);
- Al final de cada transacción que se ejecuta en el servidor de aplicaciones, tanto si la transacción se inicia localmente como si es importada
- Al final de la transacción para la que se ha registrado la devolución de llamada.

Interfaz TransactionSynchronizationRegistry
Esta interfaz está definida en la especificación JTA 1.1. Componentes de aplicaciones de nivel de sistema como, por ejemplo, gestores de persistencia, adaptadores de recursos, enterprise beans y componentes de aplicaciones web pueden utilizar esta interfaz para registrarse con una transacción JTA. Luego, por ejemplo, el componente puede desechar una memoria caché cuando finalice una transacción.
Para obtener la interfaz TransactionSynchronizationRegistry, utilice una búsqueda JNDI de java:comp/TransactionSynchronizationRegistry.

Interfaz UOWSynchronizationRegistry
- transacciones JTA
- contenedores de transacciones locales (LTC)
- contextos ActivitySession
- Registrar objetos de sincronización con semántica de pedidos especial.
- Asociar objetos de recurso a la UOW.
- Obtener el contexto de la UOW actual.
- Obtener el estado actual de la UOW.
- Marque la UOW actual para retrotracción.
Para obtener la interfaz UOWSynchronizationRegistry, utilice una búsqueda JNDI de java:comp/websphere/UOWSynchronizationRegistry. Esta interfaz sólo está disponible en un entorno de servidor.
// Recuperar una instancia de la interfaz UOWSynchronizationRegistry de JNDI.
final InitialContext initialContext = new InitialContext();
final UOWSynchronizationRegistry uowSyncRegistry =
(UOWSynchronizationRegistry)initialContext.lookup("java:comp/websphere/UOWSynchronizationRegistry");
// Generar una instancia de una clase que implementa la interfaz javax.transaction.Synchronization
final Synchronization sync = new SynchronizationImpl();
// Registrar el objeto Synchronization con la UOW actual.
uowSynchronizationRegistry.registerInterposedSynchronization(sync);
Interfaz UOWManager
Esta interfaz UOWManager es equivalente a la interfaz TransactionManager de JTA, que define los métodos que permiten que un servidor de aplicaciones gestione los límites de las transacciones. Las aplicaciones pueden utilizar la interfaz UOWManager para manipular los contextos de UOW en el producto. La interfaz UOWManager se aplica a todos los tipos de UOW que WebSphere Application Server soporta; es decir, transacciones JTA, contenedores de transacciones locales (LTC) y contextos ActivitySession. El código de aplicación puede ejecutarse bajo un tipo concreto de UOW sin tener que utilizar un enterprise bean configurado de la manera apropiada. Lo habitual es que la lógica que se aplica en el ámbito de la UOW esté incluida en una clase interna anónima. Componentes de servidor de aplicaciones de nivel de sistema como, por ejemplo, gestores de persistencia, adaptadores de recursos, enterprise beans y componentes de aplicaciones web pueden utilizar esta interfaz.
WebSphere Application Server no proporciona una interfaz TransactionManager en la API o la interfaz de programación de sistema (SPI). La interfaz UOWManager proporciona funciones equivalentes pero WebSphere Application Server mantiene el control y la integridad de los contextos UOW.
Para obtener la interfaz UOWManager en un entorno gestionado por contenedor, utilice una búsqueda JNDI de java:comp/websphere/UOWManager. Para obtener la interfaz UOWManager fuera de un entorno gestionado por contenedor, utilice la clase UOWManagerFactory. Esta interfaz sólo está disponible en un entorno de servidor.
Puede utilizar la interfaz UOWManager para migrar una aplicación web para utilizar componentes web en lugar de enterprise beans, pero mantener el control sobre las UOW. Por ejemplo, actualmente una aplicación web utiliza la interfaz UserTransaction para empezar una transacción global, efectúa una llamada a un método en un enterprise bean de sesión configurado como no soportado para realizar trabajo no transaccional y, a continuación, finaliza la transacción global. Puede mover la lógica incluida en el método de EJB de sesión al método de ejecución de una implementación UOWAction. A continuación, sustituya el código del componente web que llama al enterprise bean de sesión con una llamada al método runUnderUOW de una interfaz UOWManager para solicitar que esta lógica se ejecute en una transacción local. De esta manera, podrá mantener el mismo nivel de control sobre las UOW que el que tenía con la aplicación original.
// Recuperar una instancia de la interfaz UOWManager de JNDI.
final InitialContext initialContext = new InitialContext();
final UOWManager uowManager = (UOWManager)initialContext.lookup("java:comp/websphere/UOWManager");
try
{
// Invocar el método runUnderUOW, lo que indica que la lógica debe ejecutarse en una
// transacción global y que no debe unirse ninguna transacción global existente, en otras
// palabras, el trabajo debe realizarse en el ámbito de una transacción global nueva.
uowManager.runUnderUOW(UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION, false, new UOWAction()
{
public void run() throws Exception
{
// Aquí se realiza el trabajo transaccional.
}
});
}
catch (UOWActionException uowae)
{
// El trabajo transaccional ha producido que se lance una excepción seleccionada.
}
catch (UOWException uowe)
{
// La finalización de la UOW ha fallado inesperadamente. Utilice el método getCause de
// UOWException para recuperar la causa de la anomalía.
}