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.
Las políticas de concurrencia configuran comportamientos y restricciones relacionados con la concurrencia que se aplican a ejecutores planificados gestionados como, por ejemplo, la concurrencia máxima y el tamaño de cola máximo. De forma predeterminada, los ejecutores planificados gestionados utilizan el elemento de configuración concurrencyPolicy de la instancia predeterminada, defaultConcurrencyPolicy, que tiene restricciones no limitadas. Esta política de concurrencia predeterminada se utiliza si se configura un ejecutor planificado gestionado sin hacer referencia a, ni configurar directamente un elemento concurrencyPolicy concreto como un elemento anidado. Si varios ejecutores planificados gestionados u otros elementos de configuración hacen referencia al mismo elemento concurrencyPolicy, las restricciones de esa política se aplican a todas las instancias de ejecutor planificado gestionado y a otros recursos configurados. También se puede configurar un ejecutor planificado gestionado con una política de concurrencia para tareas de larga duración, que se aplica a tareas con la propiedad de ejecución LONGRUNNING_HINT establecida a true. La configuración especificada en el elemento concurrencyPolicy y en el elemento de larga duración concurrencyPolicy se aplica a tareas tan pronto como sea posible.
La configuración no se aplica a las tareas planificadas.
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);