Configuración ejecutores planificados gestionados
Puede configurar instancias de ManagedScheduledExecutorService para planificar las tareas asíncronas para que se ejecuten con el contexto de hebras de la hebra desde la que se ha planificado la tarea. Es aconsejable impedir que las aplicaciones Java™ EE gestionen directamente sus propias hebras; por lo tanto, ManagedScheduledExecutorService amplía JSE ExecutorService para ofrecer un modo de planificar tareas asíncronas dentro de un entorno de servidor de aplicaciones. También puede configurar ManagedScheduledExecutorService para capturar un contexto de hebras que sea relevante para las aplicaciones Java EE y propagarlo a la hebra de la tarea planificada.
Acerca de esta tarea
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
La captura y la propagación de contexto de hebras están gestionadas por el servicio de contexto. 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 una ManagedScheduledExecutorService 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. Para obtener más información sobre las instancias de servicio de contexto, consulte el tema sobre la configuración de instancias de servicio de contexto de hebra.
Una instancia de ejecutor planificado gestionado predeterminada (DefaultManagedScheduledExecutorService) está disponible como java:comp/DefaultManagedScheduledExecutorService y utiliza la instancia de servicio de contexto predeterminada para la captura y la propagación del contexto de hebras.
Procedimiento
Configuración de ejemplo del archivo server.xml:
Ejemplo
Inyectar ejecutores planificados gestionados en los componentes de aplicación (mediante @Resource) o consultarlos con referencias de entorno de recursos (resource-env-ref). Independientemente de cómo se obtenga la instancia, puede utilizarse de forma intercambiable como javax.enterprise.concurrent.ManagedScheduledExecutorService o cualquiera de las siguientes superclases: java.util.concurrent.ScheduledExecutorSerivce, java.util.concurrent.ExecutorService, javax.enterprise.concurrent.ManagedExecutorService
- Ejemplo que busca el ejecutor planificado gestionado
predeterminado:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup( "java:comp/DefaultManagedScheduledExecutorService"); executor.schedule(beginSalePrices, 12, TimeUnit.HOURS); executor.schedule(restoreNormalPrices, 60, TimeUnit.HOURS);
- Ejemplo que utiliza @Resource para inyectarse como
java.util.concurrent.ScheduledExecutorService:
@Resource(lookup="concurrent/scheduledExecutor2") ScheduledExecutorService executor; ... // planificar una tarea para que se ejecute cada media hora a partir de ahora Runnable updateSalesReport = new Runnable() { public void run() throws Exception { // es posible la búsqueda java:comp porque está configurado <jeeMetadataContext> 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);
- Ejemplo que utiliza @Resource para inyectarse como
javax.enterprise.concurrent.ManagedScheduledExecutorService:
@Resource(lookup="concurrent/scheduledExecutor2") ManagedScheduledExecutorService executor; ... usage is same as previous example
- Ejemplo de <resource-env-ref> para
java.util.concurrent.ScheduledExecutorService en el archivo
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>
- Ejemplo de <resource-env-ref> para
javax.enterprise.concurrent.ManagedScheduledExecutorService en el
archivo 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>
- Ejemplo de búsqueda que utiliza una referencia de entorno de recursos:
ManagedScheduledExecutorService executor = (ManagedScheduledExecutorService) new InitialContext().lookup("java:comp/env/concurrent/scheduledExecutor2"); executor.schedule(payrollTask, fridaysAtMidnightTrigger);