API für Geschäftsaktivitäten

Mit der API für Geschäftsaktivitäten können Sie Geschäftsaktivitäten und Kompensationshandler für eine Anwendungskomponente erstellen und Daten protokollieren, die für die Kompensation einer Aktivität bei einer Störung der Gesamtgeschäftsaktivität erforderlich sind.

Übersicht

Die Unterstützung für Geschäftsaktivitäten stellt eine Anwendungsprogrammierschnittstelle "UserBusinessActivity" und zwei Schnittstellen bereit: serializable.CompensationHandler und CompensationHandler. Jede Schnittstelle hat zwei Ausnahmen: RetryCompensationHandlerException und CompensationHandlerFailedException. Sie können die Schnittstelle "UserBusinessActivity" über den JNDI-Namespace (Java™ Naming and Directory Interface) des Anwendungsservers unter java:comp/websphere/UserBusinessActivity suchen. Beispiele:
InitialContext ctx = new InitialContext();
UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup("java:comp/websphere/UserBusinessActivity");
Sie können die Methode getId verwenden, um auf die eindeutige Kennung der Geschäftsaktivität zuzugreifen, die dem aufrufenden Thread derzeit zugeordnet ist. Die Kennung ist dieselbe, die für den Geltungsbereich der Geschäftsaktivität zur Laufzeit generiert wird und für Informations-, Warnungs- und Fehlernachrichten verwendet wird. Die Anwendung kann die Kennung in Prüf- oder Diagnosenachrichten verwenden, und es ist eine Korrelation zwischen anwendungsgenerierten und laufzeitgenerierten Nachrichten möglich.
InitialContext initialContext = new InitialContext();
UserBusinessActivity uba = initialContext.lookup("java:comp/websphere/UserBusinessActivity"); 
… 
String activityId = uba.getId(); 
if (activityId == null) 
// Keine Aktivität im Thread
else
// Ausgabeprüfnachricht einschließlich Aktivitäts-ID
Wenn eine Anwendungskomponente Arbeit ausführt, die bei einer Störung in der Geschäftsaktivität kompensiert werden muss, müssen Sie einen Kompensationshandlerklasse angeben, die mit der implementierten Anwendung assembliert wird. Diese Java-Klasse muss eine der folgenden Schnittstellen implementieren:
  • com.ibm.websphere.wsba.serializable.CompensationHandler (verwendet ein serialisierbares Objekt als Parameter)
  • com.ibm.websphere.wsba.CompensationHandler (verwendet ein SDO (Service Data Object) als Parameter)
Gewöhnlich verwenden Anwendungen, deren Daten bereits im DataObject-Format zur Verfügung steht, die Schnittstelle "CompensationHandler", und die anderen Anwendungen verwenden die Schnittstelle "serializable.CompensationHandler". Beide Schnittstellen unterstützen die Methoden close und compensate.

Eine Anwendung muss eine Kompensationshandlerimplementierung registrieren, die den Typ von Kompensationsdaten (serialisierbares Objekt oder SDO) bearbeitet, der von der Anwendung verwendet wird. Wenn es eine Abweichung zwischen dem von der Anwendungskomponente und dem von der Kompensationshandlerimplementierung verwendeten Datentyp gibt, tritt ein Fehler auf.

Während der normalen Anwendungsverarbeitung kann die Anwendung einen oder mehrere Aufrufe an die Methoden setCompensationDataImmediate und setCompensationDataAtCommit absetzen und ein serialisierbares Objekt oder SDO übergeben, das den aktuellen Status der ausgeführten Arbeit repräsentiert.

Wenn die zugrunde liegende Arbeitseinheit (UOW, Unit of Work), der die eigentliche Geschäftsaktivität zugeordnet ist, beendet ist, werden alle registrierten Kompensatoren koordiniert beendet. Dabei wird die Methode compensate oder close im Kompensationshandler aufgerufen. In dem Aufruf werden die aktuellen Kompensationsdaten, die von der Anwendungskomponente protokolliert wurden, als Parameter übergeben. Ihre Kompensationshandlerimplementierung muss die Daten interpretieren können, die im serialisierbaren Objekt bzw. im SDO-DataObject gespeichert sind. Der Kompensationshandler muss auf der Basis dieser Daten die Art der von der Enterprise-Bean ausgeführten Arbeit bestimmen und die Arbeit entsprechend kompensieren oder schließen, z. B. an Datenbankzeilen vorgenommene Änderungen rückgängig machen, wenn eine Störung in der Geschäftsaktivität auftritt. Sie ordnen den Kompensationshandler mit einem Assembliertool wie Rational Application Developer einer Anwendungskomponente zu.

Aktive und inaktive Kompensationshandler

Sie implementieren die Schnittstelle "serializable.CompensationHandler" bzw. "CompensationHandler" für jede Anwendungskomponente, die Code ausführt, der unter Umständen im Rahmen einer Geschäftsaktivität kompensiert werden muss. Kompensationshandlerobjekte werden implizit im Geltungsbereich der Geschäftsaktivität, unter der die Anwendung ausgeführt wird, registriert, wenn die Anwendung die Anwendungsprogrammierschnittstelle "UserBusinessActivity" aufruft, um Kompensationsdaten anzugeben. Ein Kompensationshandler kann je nach Transaktionsarbeitseinheit, unter der er registriert ist, den Status Aktiv oder Inaktiv annehmen. Ein Kompensationshandler, der bei einer Transaktionsarbeitseinheit registriert ist, kann inaktiv sein, bis die Transaktion festgeschrieben wird. Danach nimmt er den Status aktiv an. Ein Kompensationshandler, der außerhalb einer transaktionsorientierten Arbeitseinheit registriert wird, wird sofort aktiv.

Wenn eine Geschäftsaktivität abgeschlossen ist, verwendet sie nur aktive Kompensationshandler. Alle inaktiven Kompensationshandler, die der Geschäftsaktivität zugeordnet sind, werden verworfen und nicht mehr verwendet.

Kompensationsdaten protokollieren

Die API für Geschäftsaktivitäten spezifiziert zwei Methoden, mit denen die Anwendung Kompensationsdaten protokollieren kann. Diese Daten werden nach Abschluss der Geschäftsaktivität an die Kompensationshandler übergeben. Die Anwendung ruft eine dieser Methoden auf. Welche Methode aufgerufen wird, richtet sich danach, ob Transaktionen in der Geschäftsaktivität erwartet werden.

setCompensationDataAtCommit()
Rufen Sie die Methode "setCompensationDataAtCommit" auf, wenn die Anwendung eine globale Transaktion im Thread erwartet.
  • Wenn eine globale Transaktion im Thread vorhanden ist, ist das CompensationHandler-Objekt zunächst inaktiv. Sollte die globale Transaktion scheitern, werden alle transaktionsbezogenen Arbeiten, die im Transaktionskontext ausgeführt wurden, schrittweise rückgängig gemacht. Die Geschäftsaktivität wird angewiesen, andere abgeschlossene UOWs zu kompensieren. Der Kompensationshandler muss nicht beteiligt werden. Wenn die globale Transaktion erfolgreich festgeschrieben wird, wird der Kompensationshandler aktiv, weil er für die Kompensation permanenter Arbeiten erforderlich ist, die von der globalen Transaktion ausgeführt werden, falls die gesamte Geschäftsaktivität scheitert. Die Methode "setCompensationDataAtCommit" konfiguriert die CompensationHandler-Instanz für die Durchführung dieser Kompensationsfunktion.
  • Wenn beim Aufruf der Methode "setCompensationDataAtCommit" keine globale Transaktion vorhanden ist, wird der Kompensationshandler sofort aktiv.
Beispiel für ein SDO unter Verwendung derselben Geschäftsaktivitätsinstanz wie im vorherigen Beispiel:
DataObject compensationData = doWorkWhichWouldNeedCompensating();
uba.setCompensationDataAtCommit(compensationData); 
setCompensationDataImmediate()

Rufen Sie die Methode "setCompensationDataImmediate" auf, wenn die Anwendung keine globale Transaktion im Thread erwartet.

Die Methode "setCompensationDataImmediate" aktiviert eine CompensationHandler-Instanz sofort, unabhängig vom aktuellen UOW-Kontext zum Zeitpunkt des Methodenaufrufs. Der Kompensationshandler kann jederzeit an der Durchführung der Geschäftsaktivität teilnehmen.

Die Methode "setCompensationDataImmediate" kompensiert alle nicht transaktionsbezogenen Arbeiten, d. h. Arbeiten, die innerhalb oder außerhalb einer globalen Transaktion ausgeführt werden können, aber nicht von der Transaktion gesteuert werden. Ein Beispiel für diesen Typ von Arbeit ist das Senden einer E-Mail. Der Kompensationshandler muss sofort aktiviert werden, damit diese nicht transaktionsbezogene Arbeit beim Auftreten eines Fehlers innerhalb einer Geschäftsaktivität immer kompensiert wird.

Beispiel für ein serialisierbares Objekt unter Verwendung derselben Geschäftsaktivitätsinstanz wie im vorherigen Beispiel:
Serializable compensationData = new MyCompensationData();
uba.setCompensationDataImmediate(compensationData); 

Obwohl diese beiden Protokollierungsmethoden für Kompensationsdaten dieselbe Kompensationshandlerklasse aufrufen, wenn sie in derselben Enterprise-Bean aufgerufen werden, erstellen sie zur Laufzeit zwei gesonderte Instanzen der Klasse compensation. Deshalb schließen sich die Aktionen der Methoden gegenseitig aus. Beim Aufruf einer der Methoden werden die Arbeiten, die von der anderen Methode ausgeführt werden, nicht überschrieben.

Wenn der Geschäftsaktivität bereits über eine dieser Methoden eine Kompensationshandlerinstanz hinzugefügt wurde und anschließend dieselbe Methode mit null als Parameter aufgerufen wird, wird diese Kompensationshandlerinstanz aus der Geschäftsaktivität entfernt und beim Abschluss der Geschäftsaktivität nicht für eine Schließ- oder Kompensationsoperation aufgerufen.

Wie zuvor beschrieben, fügt die Unterstützung für Geschäftsaktivitäten eine Kompensationshandlerinstanz zur Geschäftsaktivität hinzu, wenn eine Protokollierungsmethode für Kompensationsdaten zum ersten Mal von der Enterprise-Bean aufgerufen wird, die diese Geschäftsaktivität verwendet. Zur gleichen Zeit wird eine Momentaufnahme des Unternehmensanwendungskontextes erstellt und zusammen mit den Kompensationsdaten protokolliert. Nach Abschluss der Geschäftsaktivität werden alle Kompensationshandler, die der Geschäftsaktivität hinzugefügt wurden, an die Methode compensate oder close übergeben. Der Code, den Sie in der Klasse "CompensationHandler" oder "serializable.CompensationHandler" erstellen, wird in demselben Unternehmensanwendungskontext ausgeführt, der in der früheren Momentaufnahme erfasst wurde.

Einzelheiten zu den in der Anwendungsprogrammierschnittstelle für Geschäftsaktivitäten verfügbaren Methoden finden Sie im Artikel zu zusätzlichen APIs.

Symbol, das den Typ des Artikels anzeigt. Referenzartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rjta_wsba_api
Dateiname:rjta_wsba_api.html