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

Se recomienda que las aplicaciones Java™ EE no gestionen directamente sus propias hebras; de esta forma, ContextService proporciona una forma de establecer un contexto de hebras capturado previamente en las hebras no gestionadas, así como en las hebras gestionadas, lo que sobrescribe cualquier contexto de hebras que esté aplicado.

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

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>

Ejemplo

Configurar instancias de servicio de contexto de hebras en el 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>

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);
    ...

Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_config_contextservice.html