Steuerprogramme für verwaltete, terminierte Tasks konfigurieren
Sie können ManagedScheduledExecutorService-Instanzen so konfigurieren, dass sie asynchrone Tasks für die Ausführung mit dem Threadkontext des Threads terminieren, über den die Task terminiert wird. Für Java™ EE-Anwendungen hat es sich bewährt, die direkte Verwaltung der eigenen Threads zu vermeiden. Daher erweitert der ManagedScheduledExecutorService den JSE ExecutorService dahingehend, dass dieser eine Methode zum Planen asynchroner Tasks in einer Anwendungsserverumgebung bereitstellt. Sie können den ManagedScheduledExecutorService auch so konfigurieren, dass dieser einen Threadkontext, der für Java EE-Anwendungen relevant ist, erfasst und an den Thread der terminierten Task weitergibt.
Informationen zu diesem Vorgang
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Die Erfassung und Weitergabe des Threadkontexts 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 ManagedScheduledExecutorService 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 ManagedScheduledExecutorService (DefaultManagedScheduledExecutorService) ist als java:comp/DefaultManagedScheduledExecutorService verfügbar. Sie verwendet die Standardinstanz des Servicekontexts für die Erfassung und Weitergabe des Threadkontexts.
Vorgehensweise
Beispielkonfiguration in der Datei server.xml:
Beispiel
Sie können Steuerprogramme für verwaltete, terminierte Tasks in Anwendungskomponenten einfügen (mit @Resource) oder mit Ressourcenumgebungsreferenzen (resource-env-ref) suchen. Unabhängig davon, wie die Instanz angefordert wird, kann sie abwechselnd als javax.enterprise.concurrent.ManagedScheduledExecutorService oder eine der folgenden Superklassen verwendet werden: java.util.concurrent.ScheduledExecutorSerivce, java.util.concurrent.ExecutorService, javax.enterprise.concurrent.ManagedExecutorService.
- Beispiel, das das Steuerprogramm für verwaltete, terminierte Tasks sucht:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup( "java:comp/DefaultManagedScheduledExecutorService"); executor.schedule(beginSalePrices, 12, TimeUnit.HOURS); executor.schedule(restoreNormalPrices, 60, TimeUnit.HOURS);
- Beispiel, in dem @Resource für die Injektion als java.util.concurrent.ScheduledExecutorService verwendet wird:
@Resource(lookup="concurrent/scheduledExecutor2") ScheduledExecutorService executor; ... // eine Task planen, die ab sofort halbstündlich ausgeführt werden soll Runnable updateSalesReport = new Runnable() { public void run() throws Exception { // java:comp-Suche ist möglich, weil <jeeMetadataContext> konfiguriert ist DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... query and update various database tables } }; ScheduledFuture<?> future = executor.scheduleAtFixedRate(updateSalesReport, 0, 30, TimeUnit.MINUTES);
- Beispiel, in dem @Resource für die Injektion als javax.enterprise.concurrent.ManagedScheduledExecutorService verwendet wird:
@Resource(lookup="concurrent/scheduledExecutor2") ManagedScheduledExecutorService executor; ... usage is same as previous example
- Beispiel für die Verwendung von <resource-env-ref> für java.util.concurrent.ScheduledExecutorService in
der Datei web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor1</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- Beispiel für die Verwendung von <resource-env-ref> für javax.enterprise.concurrent.ManagedScheduledExecutorService in
der Datei web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/scheduledExecutor2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedScheduledExecutorService</resource-env-ref-type> </resource-env-ref>
- Beispielsuche, die eine Ressourcenumgebungsreferenz verwendet:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup("java:comp/env/concurrent/scheduledExecutor2"); executor.schedule(payrollTask, fridaysAtMidnightTrigger);