JTA-Unterstützung
Die JTA-Unterstützung (Java™ Transaction API) stellt zusätzlich zur Schnittstelle "UserTransaction", die in der Spezifikation JTA 1.1 definiert ist, weitere Anwendungsprogrammierschnittstellen zur Verfügung.
- Schnittstelle "SynchronizationCallback"
- Schnittstelle "ExtendedJTATransaction"
- Schnittstelle "UOWSynchronizationRegistry"
- Schnittstelle "UOWManager"
- Zugriff auf die IDs globaler und lokaler Transaktionen, die dem Thread zugeordnet sind.
Die globale ID basiert auf der Transaktions-ID im Objekt "CosTransactions::PropagationContext:", und die lokale ID identifiziert die Transaktion eindeutig in der lokalen Java Virtual Machine (JVM).
- Callback für Transaktionssynchronisation, den jede Komponente der Unternehmensanwendung
verwenden kann, um ihren Bedarf am Transaktionsabschluss zu registrieren.
Erweiterte Anwendungen können diesen Callback verwenden, um vor dem Transaktionsabschluss eine Flush-Operation für die Aktualisierungen durchzuführen und nach dem Transaktionsabschluss eine Statusbereinigung durchzuführen. Java EE-Spezifikationen (und verwandte Spezifikationen) platzieren diese Funktion im Allgemeinen als Domäne der Container der Unternehmensanwendung.
Komponenten wie Persistenzmanager, Ressourcenadapter, Enterprise-Beans und Webanwendungskomponenten, können sich bei einer JTA-Transaktion registrieren.
Die folgenden Informationen geben Ihnen einen Überblick über die Schnittstellen, die von der JTA-Unterstützung bereitgestellt werden. Ausführliche Informationen hierzu finden Sie in der generierten API-Dokumentation.
Schnittstelle "SynchronizationCallback"
Ein Objekt, das diese Schnittstelle implementiert, wird einmal mit der Schnittstelle "ExtendedJTATransaction" registriert und erhält beim Abschluss einer Transaktion eine Benachrichtigung.
Obwohl ein Objekt, das die Schnittstelle implementiert, in einem Java EE-Server ausgeführt werden kann, ist keine bestimmte Komponente der Unternehmensanwendungsserver aktiv, wenn dieses Objekt aufgerufen wird. Somit hat das Objekt eingeschränkten Direktzugriff auf alle Ressourcen der Unternehmensanwendung. Insbesondere hat das Objekt keinen Zugriff auf den Namespace "java:" und auf die vom Container vermittelte Ressource. Ein solches Objekt kann eine Referenz auf eine Komponente der Unternehmensanwendung (z. B. eine Stateless-Session-Bean) zwischenspeichern, an die es den Zugriff delegiert. Das Objekt würde dann gewöhnlichen Zugriff auf die Ressourcen der Unternehmensanwendung haben. Sie könnten das Objekt beispielsweise verwenden, um eine JDBC-Verbindung (Java Database Connectivity) anzufordern und während der Ausführung der Methode "beforeCompletion" eine Flush-Operation für die Aktualisierungen in einer Datenbank durchzuführen.
Schnittstelle "ExtendedJTATransaction"
Diese Schnittstelle ist eine WebSphere-Programmiermodellerweiterung für die Java EE-JTA-Unterstützung. Ein Objekt, das diese Schnittstelle implementiert, wird von Containern der Unternehmensanwendung in WebSphere Application Server, die diese Schnittstelle unterstützen, an "java:comp/websphere/ExtendedJTATransaction" gebunden. Der Zugriff auf dieses Objekt ist, wenn es über einen EJB-Container (Enterprise JavaBeans) aufgerufen wird, nicht auf komponentengesteuerte Transaktionen beschränkt.
ExtendedJTATransaction exJTA = (ExtendedJTATransaction)ctx.lookup("
java:comp/websphere/ExtendedJTATransaction");
SynchronizationCallback sync = new SynchronizationCallback();
exJTA.registerSynchronizationCallback(sync);
- Am Ende jeder Transaktion, die im Anwendungsserver ausgeführt wird, unabhängig davon, ob die Transaktion lokal gestartet oder importiert wurde.
- Am Ende der Transaktion, für die der Callback registriert wurde.

Schnittstelle "TransactionSynchronizationRegistry"
Diese Schnittstelle ist in der Spezifikation JTA 1.1 definiert. Anwendungskomponenten auf Systemebene, z. B. Persistenzmanager, Ressourcenadapter, Enterprise-Beans und Webanwendungskomponenten, können diese Schnittstelle verwenden, um sich bei einer JTA-Transaktion zu registrieren. Dann kann die Komponente beispielsweise beim Abschluss einer Transaktion eine Flush-Operation für den Cache durchführen.
Verwenden Sie zum Abrufen der Schnittstelle "TransactionSynchronizationRegistry" eine JNDI-Lookup-Operation vom Typ "java:comp/TransactionSynchronizationRegistry".

Schnittstelle "UOWSynchronizationRegistry"
- JTA-Transaktionen
- Lokale Transaktionseinschlüsse (LTC, Local Transaction Containment)
- ActivitySession-Kontexte
- Synchronisationsobjekt mit mit spezieller Sortiersemantik registrieren.
- Ressourcenobjekte der UOW zuordnen.
- Den Kontext der aktuellen UOW abrufen.
- Den aktuellen UOW-Status abrufen.
- Die aktuelle UOW für das Rollback kennzeichnen.
Verwenden Sie zum Abrufen der Schnittstelle "UOWSynchronizationRegistry" eine JNDI-Lookup-Operation vom Typ "java:comp/websphere/UOWSynchronizationRegistry". Diese Schnittstelle ist nur in einer Serverumgebung verfügbar.
// Instanz der Schnittstelle UOWSynchronizationRegistry von JNDI abrufen.
final InitialContext initialContext = new InitialContext();
final UOWSynchronizationRegistry uowSyncRegistry =
(UOWSynchronizationRegistry)initialContext.lookup("java:comp/websphere/UOWSynchronizationRegistry");
// Klasse instanzieren, die die Schnittstelle "javax.transaction.Synchronization" implementiert
final Synchronization sync = new SynchronizationImpl();
// Synchronization-Objekt bei der aktuellen UOW registrieren
uowSynchronizationRegistry.registerInterposedSynchronization(sync);
Schnittstelle "UOWManager"
Die Schnittstelle "UOWManager" entspricht der JTA-Schnittstelle "TransactionManager", das die Methoden definiert, mit denen ein Anwendungsserver Transaktionsgrenzen verwalten kann. Anwendungen können die Schnittstelle "UOWManager" verwenden, um UOW-Kontexte im Produkt zu ändern. Die Schnittstelle "UOWManager" gilt für alle Typen von UOWs, die WebSphere Application Server unterstützt, d. h. JTA-Transaktionen, lokale Transaktionseinschlüsse (LTC, Local Transaction Containment) und ActivitySession-Kontexte. Anwendungscode kann unter einem bestimmten Typ von UOW ausgeführt werden, ohne eine entsprechend konfigurierte Enterprise-Bean verwenden zu müssen. Gewöhnlich ist die Logik, die im Rahmen der UOW ausgeführt wird, in einer anonymen untergeordneten Klasse gekapselt. Anwendungsserverkomponenten auf Systemebene, z. B. Persistenzmanager, Ressourcenadapter, Enterprise-Beans und Webanwendungskomponenten, können diese Schnittstelle verwenden, um sich bei einer JTA-Transaktion zu registrieren.
WebSphere Application Server stellt keine Schnittstelle vom Typ "TransactionManager" in der API oder SPI (System Programming Interface, Systemprogrammierschnittstelle) bereit. Die Schnittstelle "UOWManager" stellt die gleiche Funktionalität bereit, aber WebSphere Application Server behält die Steuerung und verwaltet die Integrität der UOW-Kontexte.
Verwenden Sie zum Abrufen der Schnittstelle "UOWManager" in einer containergesteuerten Umgebung eine JNDI-Lookup-Operation vom Typ java:comp/websphere/UOWManager. Wenn Sie die Schnittstelle "UOWManager" außerhalb einer containergesteuerten Umgebung abrufen möchten, verwenden Sie die Klasse "UOWManagerFactory". Diese Schnittstelle ist nur in einer Serverumgebung verfügbar.
Sie können die Schnittstelle "UOWManager" verwenden, um eine Webanwendung so zu migrieren, dass sie Webkomponenten anstelle von Enterprise-Beans verwendet, aber die Steuerung über die UOWs behält. Beispiel: Eine Webanwendung verwendet derzeit die Schnittstelle "UserTransaction", um eine globale Transaktion zu starten. Sie setzt einen Abruf an eine Methode in einer Session-Enterprise-Bean ab, die laut Konfiguration keine nicht transaktionsorientierten Arbeiten unterstützt, und schließt dann die globale Transaktion ab. Sie können die Logik, die in der Session-EJB-Methode gekapselt ist, in die Ausführungsmethode einer UOWAction-Implementierung verlagern. Anschließend ersetzen Sie den Code in der Webkomponente, die die Session-Enterprise-Bean aufruft, durch einen Aufruf der Methode "runUnderUOW" in einer Schnittstelle "UOWManager", um anzufordern, dass diese Logik unter einer lokalen Transaktion ausgeführt wird. Auf diese Weise erhalten Sie dieselbe Steuerung über die UOWs wie mit der ursprünglichen Anwendung.
// Instanz der Schnittstelle UOWManager von JNDI abrufen.
final InitialContext initialContext = new InitialContext();
final UOWManager uowManager = (UOWManager)initialContext.lookup("java:comp/websphere/UOWManager");
try
{
// Methode runUnderUOW aufrufen und damit anzeigen, dass die Logik unter einer globalen Transaktion, aber keine
// der vorhandenen globalen Transaktionen verwendet werden soll, d. h., die Arbeit muss im Rahmen einer neuen
// globalen Transaktion ausgeführt werden.
uowManager.runUnderUOW(UOWSynchronizationRegistry.UOW_TYPE_GLOBAL_TRANSACTION, false, new UOWAction()
{
public void run() throws Exception
{
// Transaktionsorientierte Arbeit hier ausführen
}
});
}
catch (UOWActionException uowae)
{
// Transaktionsorientierte Arbeit hat zum Auslösen einer geprüften Ausnahme geführt
}
catch (UOWException uowe)
{
// Der Abschluss der UOW ist unerwartet fehlgeschlagen. Methode getCause von
// UOWException verwenden, um die Fehlerursache abzurufen
}