Configuración de las instancias ManagedExecutorService
Puede configurar las instancias ManagedExecutorService para que ejecuten tareas asíncronas con el contexto de hebra especificado. Es aconsejable impedir que las aplicaciones Java™ EE gestionen directamente sus propias hebras; por lo tanto, ManagedExecutorService amplía el servicio JSE ExecutorService para ofrecer un modo de iniciar tareas asíncronas dentro de un entorno de servidor de aplicaciones. También puede configurar ManagedExecutorService de modo que propague distintos contextos de hebras relevantes para las aplicaciones Java EE a la hebra de la tarea asíncrona.
Acerca de esta tarea
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
El servicio del contexto gestiona la propagación de contexto a la hebra de un tarea ejecutada mediante ManagedExecutorService. El servidor crea una instancia predeterminada del servicio del contexto (DefaultContextService) y se configura para propagar al menos classloaderContext, jeeMetadataContext y securityContext. Se utiliza esta instancia de servicio del contexto predeterminado si se crea un ManagedExecutorService sin hacer referencia a una instancia de servicio del contexto específica o se configura una instancia de servicio de contexto directamente dentro de ésta. Consulte el tema sobre la configuración de instancias de servicio de contexto de hebra para obtener más información.
Pasa a estar disponible una instancia de ejecutor gestionado predeterminado (DefaultManagedExecutorService) como java:comp/DefaultManagedExecutorService y utiliza la instancia de servicio de contexto predeterminado para la captura y propagación de contexto de hebra.
Procedimiento
Configuración de ejemplo del archivo server.xml:
Ejemplo
Las instancias de servicio ejecutor gestionado se pueden introducir en los componentes de la aplicación (mediante @Resource) o se pueden consultar con referencias de entorno de recursos (resource-env-ref). Independientemente de cómo se obtenga la instancia, puede utilizarla de forma intercambiable como javax.enterprise.concurrent.ManagedExecutorService o como su superclase java.util.concurrent.ExecutorSerivce.
- Ejemplo que utiliza @Resource para inyectarse como
java.util.concurrent.ExecutorService:
@Resource(lookup="concurrent/execSvc1") ExecutorService execSvc1; ... // enviar la tarea a ejecución Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // es posible la búsqueda java:comp porque está configurado <jeeMetadataContext> DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... realizar actualizaciones en la base de datos return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- Ejemplo que utiliza @Resource para inyectarse como
javax.enterprise.concurrent.ManagedExecutorService:
@Resource(lookup="concurrent/execSvc1") ManagedExecutorService execSvc1; ... // enviar la tarea a ejecución Future<Integer> future1 = execSvc1.submit(new Callable<Integer>() { public Integer call() throws Exception { // es posible la búsqueda java:comp porque está configurado <jeeMetadataContext> DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... realizar actualizaciones en la base de datos return updateCount; } }); Future<Integer> future2 = execSvc1.submit(anotherTaskThatUpdatesADatabase); numUpdatesCompleted = future1.get() + future2.get();
- Ejemplo de <resource-env-ref> para java.util.concurrent.ExecutorService en el archivo
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>
- Ejemplo de <resource-env-ref> para
javax.enterprise.concurrent.ManagedExecutorService en el archivo
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>
- Ejemplo de búsqueda que utiliza una referencia de entorno de recursos:
ExecutorService execSvc2 = (ExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));
- Ejemplo de búsqueda que utiliza una referencia de entorno de recursos y se
transforma en ManagedExecutorService:
ManagedExecutorService execSvc2 = (ManagedExecutorService) new InitialContext().lookup("java:comp/env/concurrent/execSvc2"); futures = execSvc2.invokeAll(Arrays.asList(task1, task2, task3));