Concurrency Utilities for Java EE

Mit dem asynchronen Programmiermodell Concurrency Utilities for Java™ EE können Sie gleichzeitig auszuführende Tasks übergeben oder planen, Threads mit Java EE-Kontext erstellen und Java EE-Kontext weiterleiten, um Schnittstellen wie asynchrone Callbacks aufzurufen.

Concurrency Utilities for Java EE kann die Leistung verbessern, indem ein Java EE-Programm in die Lage versetzt wird, Operationen in parallele Tasks zu gliedern.

Tasks können mit dem Java EE-Kontext der übergebenden Java EE-Komponente ausgeführt werden. Diese Tasks können auch mit Kopien anderer Java EE-Kontexte ausgeführt werden, z. B.:
  • Sicherheitskontext
  • Internationalisierungskontext
  • Arbeitsbereichskontext

Schnittstellen für den gemeinsamen Zugriff

Concurrency Utilities for Java EE stellt vier Hauptressourcentypen bereit, die jeweils konfiguriert und in JNDI verfügbar gemacht werden können:

Verwalteter Steuerprogrammservice
Anwendungen verwenden ein verwaltetes Steuerprogramm, um asynchrone Tasks zu übergeben, die als Threads (gewöhnlich aus einem Pool) gestartet werden können, wenn Ressourcen für deren Ausführung verfügbar werden. Die Tasks sind Instanzen von Callable bzw. Runnable. Die Anwendung erhält die Variable future, mit der sie den Status überprüfen und das Ergebnis der Taskausführung abrufen oder abwarten kann. Das verwaltete Steuerprogramm enthält Schnittstellen für das Übergeben und Abwarten des Abschlusses der Ausführung einer Taskgruppe bzw. einer einzigen Task in einer Gruppe. Tasks übernehmen den Kontext des Threads, der die Task übergibt.
Steuerprogrammservice für verwaltete, terminierte Tasks
Anwendungen verwenden ein Steuerprogramm für verwaltete, terminierte Tasks, um die Ausführung asynchroner Tasks nach einem bestimmten Zeitpunkt zu terminieren. Die Tasks sind Instanzen von Callable bzw. Runnable. Das verwaltete Steuerprogramm für terminierte Tasks enthält Schnittstellen für die automatische Neuterminierung einer Task in einem festen Intervall oder gemäß einer angepassten Geschäftslogik berechnet. Tasks übernehmen den Kontext des Threads, der die Task terminiert.
Managed-Thread-Factory
Anwendungen verwenden eine Managed-Thread-Factory, um neue Threads zu erstellen, die den Kontext der Anwendungskomponente übernehmen, die die Managed-Thread-Factory gesucht oder eingefügt hat.
Kontextservice
Anwendungen verwenden einen Kontextservice, um kontextabhängige Proxys zu erstellen. Dadurch ist es möglich, eine oder mehrere Proxy-Schnittstellen aufzurufen, um den Kontext des Threads zu übernehmen, der den Proxy erstellt hat.

Transaktionen

Jede übergebene oder terminierte Task, jeder Managed-Thread-Factory-Thread und jede Operation eines kontextabhängigen Proxys wird mit einer Transaktion aufgerufen, die sich zuvor im ausgesetzten Thread befand, ähnlich wie containergesteuerte Transaktionen in typischen Enterprise-Beans. Dies ist vergleichbar mit der Situation, in der eine EJB-Methode mit TX_NOT_SUPPORTED aufgerufen wird. Die Laufzeit startet einen lokalen Transaktionseinschluss vor dem Aufruf der Methode. Die Task kann eine eigene globale Transaktion starten, sofern die Transaktion für die aufrufende Java EE-Komponente möglich ist. Sie können dieses Verhalten für kontextabhängige Proxys durch Angabe der Ausführungseigenschaft TRANSACTION mit dem Wert USE_TRANSACTION_OF_EXECUTION_THREAD außer Kraft setzen. Mit dieser Eigenschaft kann die Transaktion im Ausführungsthread bleiben, sodass transaktionsorientierte Operationen, die in der Proxy-Methode ausgeführt werden, zusammen mit der Transaktion des aufrufenden Threads festgeschrieben und rückgängig gemacht werden können.

Wird eine Entity-Bean beispielsweise über eine Task aufgerufen, muss im aktuellen Thread ein globaler Transaktionskontext verfügbar sein. Weil Tasks lokale Transaktionskontexte starten, können Sie die gesamte Logik der Entity-Bean in eine Session-Bean einschließen, die über eine als TX_REQUIRES oder entsprechend gekennzeichnete Methode verfügt. Dadurch wird ein globaler Transaktionskontext erstellt, über den auf eine oder mehrere Entity-Bean-Methoden zugegriffen werden kann.

Zugriff auf die Metadaten einer Java EE-Komponente

Handelt es sich bei einer Task um eine Java EE-Komponente, z. B. um eine Session-Bean, sind beim Aufruf einer Methode deren eigene Metadaten aktiv. Handelt es sich bei einer Task um ein einfaches Java-Objekt, stehen der Bean die Java EE-Komponentenmetadaten der erstellenden Komponente zur Verfügung. Ebenso wie der zugehörige übergebende Thread kann die Task die Namespaces java:comp, java:module und java:app suchen. Daher kann die Bean auf Ressourcen wie Datenquellen, Verbindungsfactorys und Enterprise-Beans zugreifen, so als ob es sich um eine Java EE-Komponente handeln würde. Die Umgebungseigenschaften der erstellenden Komponente sind für die Task ebenfalls verfügbar.

Der Namespace java:comp ist identisch mit dem Namespace, der der erstellenden Komponente zur Verfügung steht, und es gelten dieselben Einschränkungen. Wenn die Enterprise-Bean oder das Servlet beispielsweise die EJB-Referenz java:comp/env/ejb/MyEJB enthält, steht diese EJB-Referenz der Task zur Verfügung.

Verbindungsverwaltung

Eine Task kann die Datenquellen und Verbindungsfactorys verwenden, die von der zugehörigen erstellenden Java EE-Komponente mit java:comp-Ressourcenreferenzen angefordert wurden. (Weitere Informationen zu Ressourcenreferenzen finden Sie im Artikel "Referenzen".) Allerdings muss die Bean-Methode über das Muster "Abrufen, Verwenden und Schließen" auf diese Verbindungen zugreifen. Zwischen den Methodenaufrufen einer asynchronen Task werden keine Verbindungen im Cache gespeichert. Die Verbindungsfactorys und Datenquellen können im Cache gespeichert werden, aber die Verbindungen müssen bei jedem Methodenaufruf abgerufen, verwendet und dann geschlossen werden. Obwohl die Taskmethode Verbindungsfactorys und Datenquellen anhand eines globalen JNDI-Namens suchen kann, wird dies aus folgenden Gründen nicht empfohlen:

  • Der JNDI-Name ist fest in der Anwendung codiert (z. B. als Eigenschaft oder als Zeichenfolgeliteral)
  • Die Verbindungsfactorys werden nicht gemeinsam genutzt, weil es nicht möglich ist, einen gemeinsamen Bereich zu definieren.

Im Artikel "Beispiel: Verbindungsverwaltung durch Tasks" finden Sie Codebeispiele, die sowohl den richtigen Zugriff auf Verbindungen über Tasks zeigen als auch falsche Vorgehensweisen.

Verzögerter Start von kontextabhängigen Tasks

Concurrency Utilities for Java EE unterstützt den verzögerten Start, indem die Serialisierung von Java EE-Threadkontextinformationen zugelassen wird. Kontextabhängige Proxys sind serialisierbar, wenn die der Methode ContextService.createContextualProxy bereitgestellte Instanz serialisierbar ist. An diesem Punkt erstellt der Kontextservice einen Snapshot der im Arbeitsmanager aktivierten Java EE-Kontexte. Der generierte kontextabhängige Proxy kann dann in einer Datenbank oder Datei serialisiert oder gespeichert werden. Dies ist nützlich, wenn es erforderlich ist, Java EE-Servicekontexte, z. B. die aktuelle Sicherheitsidentität oder Ländereinstellung, zu speichern, sie später zu entpacken und einige Tasks in diesem Kontext auszuführen. Alle Schnittstellenmethoden des kontextabhängigen Proxys werden im zuvor erfassten Threadkontext ausgeführt.

Alle kontextabhängigen Proxys müssen von der Anwendung entserialisiert werden, von der sie serialisiert wurden. Alle EJBs und Klassen müssen vorhanden sein, damit Java die enthaltenen Objekte erfolgreich entpacken kann.

Verzögerter Start und Sicherheit

Für den Sicherheitsservicekontext muss möglicherweise die CSIv2-Identitätszusicherung (Common Secure Interoperability Version 2) aktiviert sein. Die Identitätszusicherung ist erforderlich, wenn ein kontextabhängiger Proxys entserialisiert und für die Berechtigungsnachweiszuordnung von JAAS-Subjekt-IDs (Java Authentication and Authorization Service) ausgeführt wird. Lesen Sie die folgenden Abschnitte, um besser zu verstehen, ob Sie die Identitätszusicherung aktivieren müssen, wenn Sie einen kontextabhängigen Proxy verwenden:

  • Protokolle CSIv2 und SAS konfigurieren
  • Identitätszusicherung

Auch hinsichtlich der Interoperation mit kontextabhängigen Proxys verschiedener Produktversionen gelten Einschränkungen.

JPA-bezogene Einschränkungen

Die Verwendung asynchroner Tasks in einem erweiterten JPA-Persistenzkontext wird nicht unterstützt.

Ein erweiterter JPA-Persistenzkontext ist mit den Planungs- und Multithreading-Funktionen von Concurrency Utilities for Java EE nicht kompatibel und über asynchrone Tasks nicht zugänglich.

Zugleich darf eine asynchrone Task nicht die Klasse "javax.persistence.EntityManager" (oder eine Unterklasse) als Parameter haben, weil EntityManager-Instanzen nicht threadsicher sind.


Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



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