Configuration des instances ManagedExecutorService
Vous pouvez configurer des instances ManagedExecutorService pour qu'elles exécutent des tâches asynchrones avec le contexte d'unités d'exécution spécifié. Il est recommandé pour les applications Java™ EE d'éviter qu'elles ne gèrent directement leurs propres unités d'exécution. Par conséquent, ManagedExecutorService étend JSE ExecutorService pour permettre l'exécution de tâches asynchrones dans un environnement de serveur d'application. Vous pouvez également configurer ManagedExecutorService pour propager divers contextes d'unités d'exécution pertinents aux applications Java EE dans l'unité d'exécution de la tâche asynchrone.
Pourquoi et quand exécuter cette tâche
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
La propagation du contexte dans l'unité d'exécution d'une tâche qui est exécutée par ManagedExecutorService est gérée par le service de contexte. Une instance par défaut du service de contexte (DefaultContextService) est créée par le serveur et configurée pour propager au moins classloaderContext, jeeMetadataContext et securityContext. Cette instance de service de contexte par défaut est utilisée si un ManagedExecutorService est créé sans référence à une instance de service de contexte spécifique ou sans configuration d'une instance de service de contexte directement. Reportez-vous à la rubrique Configuring thread context service instances pour plus d'informations.
Une instance d'exécuteur géré par défaut (DefaultManagedExecutorService) est disponible dans java:comp/DefaultManagedExecutorService et utilise l'instance de service de contexte par défaut pour la capture de contexte d'unités d'exécution et la propagation.
Procédure
Exemple de configuration dans le fichier server.xml :
Exemple
Des instances de service de programme d'exécution gérées peuvent être injectées dans des composants d'application (avec @Resource) ou consultées via des références d'environnement de ressource (resource-env-ref). Indépendamment de la manière dont l'instance est obtenue, vous pouvez l'utiliser de manière interchangeable en tant que javax.enterprise.concurrent.ManagedExecutorService ou sa superclasse java.util.concurrent.ExecutorSerivce.
- Exemple utilisant @Resource pour injection en java.util.concurrent.ExecutorService :
@Resource(lookup="concurrent/execSvc1") ExecutorService execSvc1; ... // soumission de la tâche à exécuter Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // la consultation java:comp est possible car <jeeMetadataContext> est configuré 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();
- Exemple utilisant @Resource pour injection en javax.enterprise.concurrent.ManagedExecutorService :
@Resource(lookup="concurrent/execSvc1") ManagedExecutorService execSvc1; ... // soumission de la tâche à exécuter Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // la consultation java:comp est possible car <jeeMetadataContext> est configuré 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();
- Exemple <resource-env-ref> pour java.util.concurrent.ExecutorService dans le fichier
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>
- Exemple <resource-env-ref> pour javax.enterprise.concurrent.ManagedExecutorService dans le fichier
web.xml :
<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>
- Exemple de consultation qui utilise une référence d'environnement de ressource :
ExecutorService execSvc2 = (ExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));
- Exemple de consultation qui utilise une référence d'environnement de ressource et
transtypages dans ManagedExecutorService :
ManagedExecutorService execSvc2 = (ManagedExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));