Configuración de fábricas de hebras gestionadas
Puede configurar instancias de ManagedThreadFactory para crear nuevas hebras que se ejecuten con el contexto de hebras de la hebra desde la que se ha consultado o inyectado la fábrica de hebras gestionadas. Es aconsejable impedir que las aplicaciones Java™ EE gestionen directamente sus propias hebras; por lo tanto, ManagedThreadFactory amplía el JSE ThreadFactory para proporcionar una forma de crear hebras gestionadas en un entorno de servidor de aplicaciones. También puede configurar ManagedThreadFactory para capturar un contexto de hebras que sea relevante para las aplicaciones Java EE y propagarlo a la nueva hebra.
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. Esta instancia de servicio de contexto predeterminado se utiliza si no se especifica un servicio de contexto ManagedThreadFactory. 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 predeterminada de ManagedThreadFactory (DefaultManagedThreadFactory) está disponible como java:comp/DefaultManagedThreadFactory y utiliza la instancia de servicio de contexto predeterminada para la captura y propagación del contexto de hebras.
Procedimiento
Configuración de ejemplo del archivo server.xml:
Ejemplo
Las fábricas de hebras gestionadas 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 utilizarse de forma intercambiable como javax.enterprise.concurrent.ManagedThreadFactory o java.util.concurrent.ThreadFactory.
- Ejemplo que busca la fábrica de hebras gestionadas predeterminada:
ManagedThreadFactory threadFactory = (ManagedThreadFactory) new InitialContext().lookup( "java:comp/DefaultManagedThreadFactory"); // Crear un ejecutor que ejecute siempre tareas con el contexto de hebras de la fábrica de hebras gestionada ExecutorService executor = new ThreadPoolExecutor( coreThreads, maxThreads, keepAliveTime, TimeUnit.MINUTES, new ArrayBlockingQueue<Runnable>(workRequestQueueSize), threadFactory, new ThreadPoolExecutor.AbortPolicy());
- Ejemplo que utiliza @Resource para inyectarse como java.util.concurrent.ThreadFactory:
@Resource(lookup="concurrent/threadFactory2") ThreadFactory threadFactory ... // crear una nueva hebra Thread dailySalesAnalysisTask = threadFactory.newThread(new Runnable() { public void run() { // la búsqueda java:comp es posible porque <jeeMetadataContext> está configurado DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... analyze the data } }); dailySalesAnalysisTask.start();
- Ejemplo que utiliza @Resource para inyectarse como
javax.enterprise.concurrent.ManagedThreadFactory:
@Resource(lookup="concurrent/threadFactory2") ManagedThreadFactory threadFactory; ... usage is same as previous example
- Ejemplo de <resource-env-ref> para
java.util.concurrent.ThreadFactory en el archivo
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>
- Ejemplo de <resource-env-ref> para
javax.enterprise.concurrent.ManagedThreadFactory en
el archivo 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>
- Ejemplo de búsqueda que utiliza una referencia de entorno de recursos:
ManagedThreadFactory threadFactory = (ManagedThreadFactory) new InitialContext().lookup("java:comp/env/concurrent/threadFactory"); // Crear un ejecutor planificado que siempre ejecute tareas con el contexto de hebras de la fábrica de hebras gestionadas ScheduledExecutorService executor = Executors.newScheduledThreadPool(5, threadFactory); ... use executor to schedule tasks from any thread