Steuerprogramme für verwaltete Tasks konfigurieren
Sie können ManagedExecutorService-Instanzen konfigurieren, um asynchrone Tasks mit dem angegebenen Threadkontext auszuführen. Für Java™ EE-Anwendungen hat es sich bewährt, die direkte Verwaltung der eigenen Threads zu vermeiden. Daher erweitert der ManagedExecutorService den JSE ExecutorService dahingehend, dass dieser eine Methode zum Planen asynchroner Tasks in einer Anwendungsserverumgebung startet. Sie können den ManagedExecutorService auch so konfigurieren, dass er verschiedene Threadkontexte, die für Java EE-Anwendungen relevant sind, an den Thread der asynchronen Task weitergibt.
Informationen zu diesem Vorgang
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Die Weitergabe von Kontext an den Thread einer Task, die vom ManagedExecutorService ausgeführt wird, wird vom Kontextservice gesteuert. Eine Standardinstanz des Kontextservice (DefaultContextService) wird vom Server erstellt und so konfiguriert, dass mindestens classloaderContext, jeeMetadataContext und securityContext weitergegeben werden. Diese Standardinstanz des Kontextservice wird verwendet, wenn ein ManagedExecutorService erstellt wird, der nicht auf eine bestimmte Kontextserviceinstanz verweist, oder wenn eine Kontextserviceinstanz darin direkt konfiguriert wird. Weitere Informationen zu Kontextserviceinstanzen finden Sie im Abschnitt zur Konfiguration von Instanzen des Threadkontextservice.
Eine Standardinstanz von ManagedExecutorService (DefaultManagedExecutorService) ist als java:comp/DefaultManagedExecutorService verfügbar. Sie verwendet die Standardkontextserviceinstanz zum Erfassen und Weitergeben des Threadkontextes.
Parallelitätsrichtlinien konfigurieren parallelitätsrelevantes Verhalten und Einschränkungen für verwaltete Steuerprogramme, wie z. B. maximale Parallelität und maximale Warteschlangengröße. Standardmäßig verwenden verwaltete, Steuerprogramme
eine Standardinstanz (defaultConcurrencyPolicy) mit unbegrenzten Einschränkungen mit einem concurrencyPolicy-Konfigurationselement. Diese Standardparallelitätsrichtlinie wird verwendet, wenn Sie ein verwaltetes Steuerprogramm konfigurieren, ohne ein bestimmtes
concurrencyPolicy-Element als verschachteltes Element zu referenzieren oder es direkt als solches zu konfigurieren. Wenn mehrere verwaltete Steuerprogramme oder andere Konfigurationselemente dasselbe concurrencyPolicy-Element referenzieren, gelten die Einschränkungen in dieser Richtlinie für alle diese verwalteten Steuerprogramminstanzen und weitere konfigurierte Ressourcen. Sie können auch ein verwaltetes Steuerprogramm mit einer Parallelitätsrichtlinie für Tasks mit langer Laufzeit konfigurieren, das für Tasks gilt, deren Ausführungseigenschaft
LONGRUNNING_HINT auf true gesetzt ist. Die über das concurrencyPolicy-Element und das concurrencyPolicy-Element für lange Laufzeit angegebene Konfiguration gilt für Tasks, die übergeben wurden, um so schnell wie möglich ausgeführt zu werden.
Die Konfiguration gilt nicht für terminierte Tasks.
Vorgehensweise
Beispielkonfiguration in der Datei server.xml:
Beispiel
ManagedExecutorService-Instanzen können in Anwendungskomponenten injiziert werden (mit @Resource) oder sie können über Ressourcenumgebungsreferenzen (resource-env-ref) ermittelt werden. Unabhängig davon, wie Sie die Instanz erhalten, können Sie sie abwechselnd als javax.enterprise.concurrent.ManagedExecutorService oder als Superklasse java.util.concurrent.ExecutorSerivce verwenden.
- Beispiel, das das verwaltete Standardsteuerprogramm sucht:
ManagedExecutorService executor = (ManagedExecutorService) new InitialContext().lookup( "java:comp/DefaultManagedExecutorService"); executor.submit(doSomethingInParallel);
- Beispiel, in dem @Resource als java.util.concurrent.ExecutorService injiziert wird:
@Resource(lookup="concurrent/execSvc1") ExecutorService execSvc1; ... // Task für Ausführung übergeben Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // java:comp Suche ist möglich, da <jeeMetadataContext> konfiguriert ist DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... make updates to the database return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- Beispiel, in dem
@Resource als
javax.enterprise.concurrent.ManagedExecutorService injiziert wird:
@Resource(lookup="concurrent/execSvc1") ManagedExecutorService execSvc1; ... // Task für Ausführung übergeben Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // java:comp Suche ist möglich, da <jeeMetadataContext> konfiguriert ist DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... make updates to the database return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- Beispiel für die Verwendung von <resource-env-ref> für java.util.concurrent.ExecutorService in der Datei web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/execSvc2</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ExecutorService</resource-env-ref-type> </resource-env-ref>
- Beispielsuche, die eine Ressourcenumgebungsreferenz verwendet:
ExecutorService execSvc2 = (ExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));
- Beispiel für die Verwendung von <resource-env-ref> für javax.enterprise.concurrent.ManagedExecutorService in
der Datei web.xml file:
<resource-env-ref> <resource-env-ref-name>concurrent/execSvc2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedExecutorService</resource-env-ref-type> </resource-env-ref>
- Beispielsuche mit Verwendung einer
Ressourcenumgebungsreferenz und Umsetzung in
ManagedExecutorService:
ManagedExecutorService execSvc2 = (ManagedExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));