Support JTA

La prise en charge de Java™ Transaction API (JTA) fournit des interfaces de programme d'application (API) en plus de l'interface UserTransaction définie dans la spécification JTA 1.1.

Ces interfaces sont TransactionSynchronizationRegistry, qui est définie dans la spécification JTA 1.1, et les extensions d'API suivantes :
  • Interface SynchronizationCallback
  • Interface ExtendedJTATransaction
  • Interface UOWSynchronizationRegistry
  • Interface UOWManager
Les API offrent les fonctions suivantes :
  • Accès aux identifiants des transactions globales et locales associées à l'unité d'exécution.

    L'identifiant global est basé sur l'identifiant de transaction dans l'objet CosTransactions::PropagationContext: et l'identifiant local identifie la transaction uniquement dans la machine virtuelle Java (JVM).

  • Un rappel de synchronisation de transaction qui permet à un composant d'application d'entreprise d'enregistrer un intérêt pour la réalisation d'une synchronisation.

    Cette fonction peut être utilisée par des applications avancées pour supprimer des mises à jour avant la réalisation d'une transaction et effacer l'état après la réalisation de la transaction. Les spécifications Java EE (et les spécifications associées) positionnent cette fonction généralement comme le domaine des conteneurs d'application d'entreprise.

    Des composants comme les gestionnaires de persistance, les adaptateurs de ressources, les beans enterprise et les composants d'applications Web peuvent s'enregistrer avec une transaction JTA.

Les informations suivantes présentent les interfaces fournies par le support JTA. Pour des informations plus détaillées, voir la documentation de l'API générée.

Interface SynchronizationCallback

Un objet implémentant cette interface est répertorié une fois dans l'interface ExtendedJTATransaction et il reçoit la notification de réalisation des transactions.

Bien qu'un objet implémentant cette interface puisse s'exécuter sur une plateforme Java pour un serveur d'applications d'entreprise, aucun composant d'application d'entreprise spécifique n'est actif lorsque cet objet est appelé. Ainsi, l'objet possède un accès direct limité aux ressources d'application d'entreprise. En particulier, l'objet n'a pas accès à l'espace de noms java: ou à une ressource utilisée par le conteneur. Ce type d'objet peut placer en mémoire cache une référence à un composant d'application d'entreprise (par exemple, un bean session sans état) auquel il effectue une délégation. L'objet possède alors tous les droits d'accès habituels aux ressources d'application d'entreprise. Par exemple, vous pouvez utiliser l'objet pour acquérir une connexion JDBC (JDBC) et vider les mises à jour d'une base de données lors de la méthode beforeCompletion.

Interface ExtendedJTATransaction

Cette interface est une extension de modèle de programmation WebSphere® pour la prise en charge JTA Java EE . Un objet implémentant cette interface est lié, par des conteneurs d'application d'entreprise dans WebSphere Application Server qui prennent en charge cette interface, à java:comp/websphere/ExtendedJTATransaction. L'accès à cet objet, lorsqu'il est appelé dans un conteneur EJB (Enterprise JavaBeans), n'est pas restreint aux transactions gérées par composant.

Une application utilise une consultation JNDI (Java Naming and Directory Interface) de java:comp/websphere/ExtendedJTATransaction pour extraire un objet ExtendedJTATransaction qu'elle utilise alors comme le montre l'exemple suivant :
ExtendedJTATransaction exJTA = (ExtendedJTATransaction)ctx.lookup("
	java:comp/websphere/ExtendedJTATransaction");
SynchronizationCallback sync = new SynchronizationCallback();
exJTA.registerSynchronizationCallback(sync);
L'objet ExtendedJTATransaction prend en charge l'enregistrement d'un ou de plusieurs objets SynchronizationCallback disponibles grâce à l'application. Selon le mode d'enregistrement du rappel, chaque rappel enregistré est appelé à l'un des stades suivants :
  • Au terme de chaque transaction s'exécutant sur le serveur d'applications, que la transaction soit lancée en local ou importée,
  • à la fin de la transaction pour laquelle le rappel a été enregistré.
Fonctionnalité obsolète: Dans cette édition, la méthode registerSynchronizationCallbackForCurrentTran est obsolète. Remplacez-la par la méthode registerInterposedSynchronization de l'interface TransactionSynchronizationRegistry.

Interface TransactionSynchronizationRegistry

Cette interface est définie dans la spécification JTA 1.1. Les composants d'application au niveau du système, tels que les gestionnaires de persistance, les adaptateurs de ressources, les beans entreprise et les composants d'applications Web, peuvent utiliser cette interface pour s'enregistrer dans une transaction JTA. Ensuite, par exemple, le composant peut vider un cache à la fin d'une transaction.

Pour obtenir l'interface TransactionSynchronizationRegistry, utilisez interface, use une consultation JNDI de java:comp/TransactionSynchronizationRegistry.

Remarque: Utilisez la méthode registerInterposedSynchronization pour enregistrer une instance de synchronisation, plutôt que la méthode registerSynchronizationCallbackForCurrentTran de l'interface ExtendedJTATransaction, qui est obsolète dans cette édition.

Interface UOWSynchronizationRegistry

Cette interface fournit les mêmes fonctions que l'interface TransactionSynchronizationRegistry, mais s'applique à tous les types d'unités de travail pris en charge par WebSphere Application Server :
  • Transactions JTA
  • Confinements de transaction locale (LTC)
  • Contextes ActivitySession
Les composants d'application au niveau du système, tels que les gestionnaires de persistance, les adaptateurs de ressources, les beans entreprise et les composants d'applications Web, peuvent utiliser cette interface pour s'enregistrer dans une transaction JTA. Le composant peut effectuer ce qui suit :
  • enregistrer des objets de synchronisation avec une sémantique particulière,
  • associer des objets de ressource à l'unité de travail,
  • obtenir le contexte de l'unité de travail en cours,
  • obtenir le statut de l'unité de travail en cours,
  • marquer l'unité de travail en cours pour annulation.

Pour vous procurer l'interface UOWSynchronizationRegistry, recourez à une consultation JNDI de java:comp/websphere/UOWSynchronizationRegistry. Cette interface est disponible uniquement dans un environnement de serveur.

L'exemple suivant enregistre une synchronisation interposée dans l'unité de travail en cours :
// Retrieve an instance of the UOWSynchronizationRegistry interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWSynchronizationRegistry uowSyncRegistry =
		(UOWSynchronizationRegistry)initialContext.lookup("java:comp/websphere/UOWSynchronizationRegistry");

// Instantiate a class that implements the javax.transaction.Synchronization interface
final Synchronization sync = new SynchronizationImpl();

// Register the Synchronization object with the current UOW.
uowSynchronizationRegistry.registerInterposedSynchronization(sync);

Interface UOWManager

L'interface UOWManager équivaut à celle JTA TransactionManager, qui définit les méthodes permettant à un serveur d'applications de gérer les limites des transactions. Les applications peuvent utiliser l'interface UOWManager pour manipuler des contextes UOW dans le produit. L'interface UOWManager s'applique à tous les types d'unité de travail que WebSphere Application Server prend en charge, à savoir des transactions JTA, des confinements de transaction locale et des contextes ActivitySession. Le code d'application peut s'exécuter dans un type particulier d'unité de travail sans qu'il soit nécessaire d'utiliser un bean enterprise configuré en conséquence. En général, la logique qui est exécutée dans la portée de l'unité de travail est encapsulée dans une classe intérieure anonyme. Les composants de serveur d'applications au niveau du système, tels que les gestionnaires de persistance, les adaptateurs de ressources, les beans enterprise et les composants d'applications Web, peuvent utiliser cette interface.

WebSphere Application Server ne fournit pas d'interface TransactionManager dans l'API ou l'interface de programmation système (SPI). L'interface UOWManager fournit des fonctions équivalentes, mais WebSphere Application Server conserve le contrôle et l'intégrité des contextes d'unité de travail.

Pour vous procurer l'interface UOWManager dans un environnement géré par conteneur, recourez à une consultation JNDI de java:comp/websphere/UOWManager. Pour obtenir l'interface UOWManager en dehors d'un environnement géré par conteneur, utilisez la classe UOWManagerFactory. Cette interface est disponible uniquement dans un environnement de serveur.

Vous pouvez utiliser l'interface UOWManager pour migrer une application Web afin d'utiliser des composants Web au lieu de beans enterprise tout en conservant le contrôle des unités de travail. Par exemple, une application Web utilise actuellement l'interface UserTransaction pour démarrer une transaction globale, appelle une méthode dans un bean enterprise de session configuré comme non pris en charge pour exécuter une tâche non transactionnelle, puis exécute la transaction globale. Vous pouvez déplacer la logique qui est encapsulée dans la méthode du bean enterprise de session vers la méthode d'exécution d'une implémentation UOWAction. Ensuite, vous remplacez le code dans le composant Web appelant le bean enterprise de session par un appel de la méthode runUnderUOW d'une interface UOWManager, afin que cette logique soit exécutée dans une transaction locale. De cette façon, vous conservez le même niveau de contrôle sur les unités de travail qu'avec l'application d'origine.

L'exemple suivant effectue des tâches transactionnelles dans la portée d'une nouvelle transaction globale. Le travail transactionnel est effectué dans une classe interne anonyme qui implémente la méthode run de l'interface UOWAction. Les exceptions contrôlées créées par la méthode d'exécution n'ont pas d'impact sur le résultat de la transaction.
// Retrieve an instance of the UOWManager interface from JNDI.
final InitialContext initialContext = new InitialContext();
final UOWManager uowManager = (UOWManager)initialContext.lookup("java:comp/websphere/UOWManager");

try
{
	// Invoke the runUnderUOW method, indicating that the logic should be run in a global 
	// transaction, and that any existing global transaction should not be joined, that is, 
	// the work must be performed in the scope of a new global transaction.
	uowManager.runUnderUOW(UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION, false, new UOWAction()
	{
 		public void run() throws Exception
 		{
			// Perform transactional work here.
 		}
	});
}

catch (UOWActionException uowae)
{
	// Transactional work resulted in a checked exception being thrown.
}

catch (UOWException uowe)
{
	// The completion of the UOW failed unexpectedly. Use the getCause method of the 
	// UOWException to retrieve the cause of the failure.
}