Managed-Thread-Factorys konfigurieren
Sie können ManagedThreadFactory-Instanzen konfigurieren, um neue Threads zu erstellen, die mit einem Threadkontext des Threads ausgeführt werden, über den die Managed-Thread-Factory gesucht oder eingefügt wird. Für Java™ EE-Anwendungen hat es sich bewährt, die direkte Verwaltung der eigenen Threads zu vermeiden. Daher erweitert die ManagedThreadFactory die JSE ThreadFactory dahingehend, dass diese eine Methode zum Erstellen verwalteter Threads in einer Anwendungsserverumgebung bereitstellt. Sie können die ManagedThreadFactory auch so konfigurieren, dass diese einen Threadkontext, der für Java EE-Anwendungen relevant ist, erfasst und an den neuen Thread 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 eine ManagedThreadFactory keinen Kontextservice angibt. Weitere Informationen zu Kontextserviceinstanzen finden Sie im Abschnitt zur Konfiguration von Instanzen des Threadkontextservice.
Eine Standardinstanz von ManagedThreadFactory (DefaultManagedThreadFactory) ist als java:comp/DefaultManagedThreadFactory verfügbar. Sie verwendet die Standardinstanz des Kontextservice für die Erfassung und Weitergabe des Threadkontextes.
Vorgehensweise
Beispielkonfiguration in der Datei server.xml:
Beispiel
Managed-Thread-Factorys können in Anwendungskomponenten injiziert werden (mit @Resource) oder mit Ressourcenumgebungsreferenzen (resource-env-ref) ermittelt werden. Unabhängig davon, wie die Instanz angefordert wird, kann sie abwechselnd als javax.enterprise.concurrent.ManagedThreadFactory oder java.util.concurrent.ThreadFactory verwendet werden.
- Beispiel, das die Standard-Managed-Thread-Factory sucht:
ManagedThreadFactory threadFactory = (ManagedThreadFactory) new InitialContext().lookup( "java:comp/DefaultManagedThreadFactory"); // Steuerprogramm erstellen, das immer Tasks mit dem Threadkontext der Managed-Thread-Factory ausführt ExecutorService executor = new ThreadPoolExecutor( coreThreads, maxThreads, keepAliveTime, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(workRequestQueueSize), threadFactory, new ThreadPoolExecutor.AbortPolicy());
- Beispiel, in dem @Resource für die Injektion als
java.util.concurrent.ThreadFactory verwendet wird:
@Resource(lookup="concurrent/threadFactory2") ThreadFactory threadFactory ... // neuen Thread erstellen Thread dailySalesAnalysisTask = threadFactory.newThread(new Runnable() { public void run() { // java:comp Suche ist möglich, da <jeeMetadataContext> konfiguriert ist DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... analyze the data } }); dailySalesAnalysisTask.start();
- Beispiel, in dem
@Resource für die Injektion als
javax.enterprise.concurrent.ManagedThreadFactory verwendet wird:
@Resource(lookup="concurrent/threadFactory2") ManagedThreadFactory threadFactory; ... usage is same as previous example
- Beispiel für die Verwendung von <resource-env-ref> für java.util.concurrent.ThreadFactory in der Datei web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/threadFactory1</resource-env-ref-name> <resource-env-ref-type>java.util.concurrent.ThreadFactory</resource-env-ref-type> </resource-env-ref>
- Beispiel für die Verwendung von <resource-env-ref> für javax.enterprise.concurrent.ManagedThreadFactory in der Datei web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/threadFactory2</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ManagedThreadFactory</resource- env-ref-type> </resource-env-ref>
- Beispielsuche, die eine Ressourcenumgebungsreferenz verwendet:
ManagedThreadFactory threadFactory = (ManagedThreadFactory) new InitialContext().lookup("java:comp/env/concurrent/threadFactory"); // ein Steuerprogramm für terminierte Tasks erstellen, das immer Tasks mit dem Threadkontext der Managed-Thread-Factory ausführt ScheduledExecutorService executor = Executors.newScheduledThreadPool(5, threadFactory); ... use executor to schedule tasks from any thread