![[8.5.5.4 o posterior]](../ng_v8554.gif)
Configuración de instancias de servicio de contexto de hebras
Puede configurar instancias de ContextService para capturar un contexto de hebras gestionadas y aplicarlo a las invocaciones de métodos de interfaz especificados en cualquier hebra.
Acerca de esta tarea
Procedimiento
Habilite el servicio de contexto de hebras en el archivo
server.xml. El servicio de contexto de hebras está disponible en la
característica <concurrent-1.0>.
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Resultados
El servidor crea una instancia de servicio de contexto de hebras predeterminada (DefaultContextService), que se configura para capturar y propagar al menos classloaderContext, jeeMetadataContext y securityContext. Puede configurar la propagación del contexto de hebras para incluir los tipos de contexto de hebras siguientes:
- classloaderContext
- Hace que el cargador de clases de contexto de hebra de la tarea esté
disponible para la tarea.
Si el cargador de clases de contexto se serializa, éste deberá ser un cargador de clases de contexto desde la aplicación. La serialización del cargador de clases para Web Application Bundles no se admite actualmente.
- jeeMetadataContext
- Hace que el espacio de nombres del componente de la aplicación que ha enviado la tarea esté disponible para la tarea.
- securityContext
Debe habilitar la característica appSecurity-2.0 en el archivo server.xml para que utilice este tipo de contexto de hebras. Hace que el sujeto llamante y el sujeto de invocación del emisor estén disponibles para la tarea, lo que se consigue iniciando una sesión con el WSPrincipal del emisor mediante un inicio de sesión JAAS. Para obtener más detalles sobre qué información en el sujeto del emisor no está en el contexto de seguridad, consulte las Restricciones de la característica concurrent-1.0.
Importante: Las
características de los productos de pila pueden proporcionar más proveedores de contexto
de hebras. El atributo baseContextRef
opcional permite que una instancia de servicio de contexto herede de la configuración
de contexto de otra instancia de servicio de contexto.
Ejemplo
Inyectar instancias de servicio de contexto de hebras en los componentes de aplicación (mediante @Resource) o consultarlas con referencias de entorno de recursos (resource-env-ref).
- Configuración de ejemplo del archivo server.xml:
- Servicio del contexto de hebras registrado en JNDI con el nombre
concurrent/threadContextSvc1, que captura y propaga sólo
jeeMetadataContext:
<contextService id="threadContextSvc1" jndiName="concurrent/${id}"> <jeeMetadataContext/> </contextService>
- Servicio de contexto de hebras con classloaderContext y
securityContext:
<contextService jndiName="concurrent/threadContextSvc2"> <classloaderContext/> <securityContext/> </securityContext/>
- Servicio de contexto de hebra que hereda jeeMetadataContext de
threadContextSvc1 y añade securityContext:
<contextService jndiName="concurrent/threadContextSvc3" baseContextRef="threadContextSvc1"> <securityContext> </contextService>
- Servicio del contexto de hebras registrado en JNDI con el nombre
concurrent/threadContextSvc1, que captura y propaga sólo
jeeMetadataContext:
- Ejemplo que utiliza @Resource:
@Resource(lookup="concurrent/threadContextSvc1") ContextService threadContextSvc1; ... Callable<Integer> processSalesOrderCompletion = new Callable<Integer>() { public Integer call() throws Exception { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ...update various database tables return isSuccessful; } }; // capturar contexto de hebras del componente de aplicación actual execProps = Collections.singletonMap(ManagedTask.TRANSACTION, ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD); processSalesOrderCompletion = (Callable<Boolean>) threadContextSvc1.createContextualProxy(processSaleCompletion, execProps, Callable.class); // posteriormente, de un componente de aplicación diferente tran.begin(); ... successful = processSalesOrderCompletion.call(); if (successful) tran.commit(); else tran.rollback();
- Ejemplo que utiliza resource-env-ref en el archivo
web.xml:
<resource-env-ref> <resource-env-ref-name>concurrent/threadContextSvc3</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.concurrent.ContextService</resource- env-ref-type> </resource-env-ref>
- Ejemplo de búsqueda que utiliza la referencia de entorno de recursos:
ContextService threadContextSvc3 = (ContextService) new InitialContext().lookup("java:comp/env/concurrent/threadContextSvc3"); Runnable updateAndGetNextFromDatabase = threadContextSvc3.createContextualProxy (new Runnable() { public void run() { DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/ds1"); ... update the database and get next item to process } }, Runnable.class); barrier = new CyclicBarrier(3, updateAndGetNextFromDatabase); ...