ManagedExecutorService-Instanzen konfigurieren
Sie können ManagedExecutorService-Instanzen konfigurieren, um asynchrone Tasks mit dem angegebenen Threadkontext auszuführen. Für Java™-EE-Anwendungen ist es ein bewährtes Verfahren, die direkte Verwaltung ihrer eigenen Threads zu vermeiden. Daher erweitert ManagedExecutorService den JSE ExecutorService dahingehend, dass dieser eine Methode zum Ausführen asynchroner Tasks in einer Anwendungsserverumgebung bereitstellt. 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 finden Sie im Artikel über die Konfiguration von Threadkontextserviceinstanzen.
Eine Standardinstanz von ManagedExecutorService (DefaultManagedExecutorService) ist als java:comp/DefaultManagedExecutorService verfügbar. Sie verwendet die Standardkontextserviceinstanz zum Erfassen und Weitergeben des Threadkontextes.
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, 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, weil <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, weil <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>
- 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, die eine Ressourcenumgebungsreferenz verwendet:
ExecutorService execSvc2 = (ExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));
- 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));