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
El servidor crea una instancia de servicio de contexto de hebras (DefaultContextService) y se configura para capturar y propagar, al menos, los elementos 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 del emisor de la tarea esté disponible para la tarea. Si el cargador de clases de contexto se serializa, el cargador de clases debe ser un cargador de clases de contexto de hebra desde la aplicación. La serialización del cargador de clases para los paquetes de aplicación web OSGi actualmente no está soportada.
- 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 la invocación del emisor estén disponibles para la tarea. Esto se consigue inciando sesión con las credenciales WSPrincipal del emisor utilizando un módulo de 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.

- syncToOSThreadContext
- Sincroniza la identidad del sujeto runAs para la unidad de trabajo con la identidad de sistema operativo.

- zosWLMContext
- Se utiliza para clasificar el trabajo.
Procedimiento
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Ejemplo
- 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>
Ejemplo que busca el servicio de contexto predeterminado:
ContextService threadContextSvc =
(ContextService) new InitialContext().lookup(
"java:comp/DefaultContextService");
myContextualAsyncCallback = threadContextSvc.createContextualProxy(
myAsyncCallback, MyAsyncCallback.class);
doSomethingAsync(arg1, arg2, myContextualAsyncCallback);
Ejemplos para inyectar instancias de servicio de contexto de hebras en los componentes de aplicación (mediante @Resource) o buscar con referencias de entorno de recursos (resource-env-ref).
- 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 especifica 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); ...