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

Der ManagedExecutorService ist unter dem Feature <concurrent-1.0> verfügbar und wird in der Datei server.xml wie folgt aktiviert:
<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.

Achtung: Derzeit bewirkt eine Einschränkung in Alpha, dass Tasks, die übergeben wurden, erst nach dem Aufruf von Future.get ausgeführt werden.

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));

Symbol das den Typ des Artikels anzeigt. Taskartikel

Nutzungsbedingungen für Information Center | Feedback


Symbol für Zeitmarke Letzte Aktualisierung: 25.08.2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_config_managedexecutor
Dateiname: twlp_config_managedexecutor.html