Configuration des instances de service du contexte d'unité d'exécution

Vous pouvez configurer des instances ContextService pour capturer un contexte d'unité d'exécution géré et l'appliquer aux appels de méthodes d'interface spécifiées sur une unité d'exécution.

Pourquoi et quand exécuter cette tâche

Il est recommandé pour les applications Java™ EE d'éviter qu'elles ne gèrent directement leurs propres unités d'exécution. Par conséquent, le service ContextService fournit une méthode pour l'établissement d'un contexte d'unité d'exécution préalablement capturé sur des unités d'exécution non gérées, ainsi que des unités d'exécution gérées, par chevauchement des contextes d'unité d'exécution déjà en place.

Une instance de service de contexte d'unité d'exécution par défaut (DefaultContextService) est créée par le serveur et configurée pour capturer et propager au moins les éléments classloaderContext, jeeMetadataContext et securityContext. Vous pouvez configurer la propagation de contexte d'unité d'exécution afin d'inclure les types de contexte d'unité d'exécution suivants :

classloaderContext
Met à disposition de la tâche le chargeur de classe de l'émetteur de la tâche. Si le chargeur de classe de contexte est sérialisé, il doit s'agir d'un chargeur de classe de contexte de l'application. La sérialisation de chargeur de classe pour les bundles d'applications Web OSGi n'est pas pris en charge pour l'instant.
jeeMetadataContext
Met à la disposition de la tâche l'espace de nom du composant d'application qui a soumis la tâche.
securityContext
Vous devez activer la fonction appSecurity-2.0 dans le fichier server.xml pour utiliser ce type de contexte d'unité d'exécution. Met à la disposition de la tâche le sujet de l'appelant et le sujet de l'appel de l'émetteur de la tâche. Pour ceci, il est nécessaire de se connecter avec les données d'identification WSPrincipal de l'émetteur à l'aide d'un module de connexion JAAS. Pour plus de détails sur le type d'informations du sujet de l'émetteur qui ne figurent pas dans le contexte de sécurité, voir la section relative aux restrictions de la fonction concurrent-1.0.

Procédure

Activez le service de contexte d'unité d'exécution dans le fichier server.xml. Le service de contexte d'unité d'exécution est disponible sous la fonction <concurrent-1.0>.
<featureManager>
	<feature>concurrent-1.0</feature>
</featureManager>

Exemple

Configurez des instances de service de contexte d'unité d'exécution dans le fichier server.xml :
  • Service de contexte d'unité d'exécution qui est enregistré dans JNDI sous le nom concurrent/threadContextSvc1, qui capture et propage jeeMetadataContext uniquement :
    <contextService id="threadContextSvc1" jndiName="concurrent/${id}">
    	<jeeMetadataContext/>
    </contextService>
  • Service de contexte d'unité d'exécution avec classloaderContext et securityContext :
    <contextService jndiName="concurrent/threadContextSvc2">
    	<classloaderContext/>
    	<securityContext/>
    </securityContext/>
  • Service de contexte d'unité d'exécution qui hérite jeeMetadataContext de threadContextSvc1 et ajoute securityContext :
    <contextService jndiName="concurrent/threadContextSvc3" 
    baseContextRef="threadContextSvc1">
    	<securityContext>
    </contextService>

Exemple qui recherche le service de contexte par défaut :

ContextService threadContextSvc =
    (ContextService) new InitialContext().lookup(
        "java:comp/DefaultContextService");
myContextualAsyncCallback = threadContextSvc.createContextualProxy(
    myAsyncCallback, MyAsyncCallback.class);
doSomethingAsync(arg1, arg2, myContextualAsyncCallback);

Examples d'injection d'instances de service de contexte d'unité d'exécution dans des composants d'application (à l'aide de @Resource) ou de recherche à l'aide de références d'environnement de ressource (resource-env-ref).

  • Exemple qui utilise @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; 
    	} 
    };  
    // capture thread context of current application component
    execProps = Collections.singletonMap(ManagedTask.TRANSACTION, 
    ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD);
    processSalesOrderCompletion = (Callable<Boolean>)
     threadContextSvc1.createContextualProxy(processSaleCompletion, execProps, 
    Callable.class);
    
    //later from a different application component
    tran.begin();
    ...
    successful = processSalesOrderCompletion.call();
    if (successful)
      tran.commit();
    else
      tran.rollback();
  • Exemple qui spécifie resource-env-ref dans le fichier 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>
  • Exemple de recherche qui utilise la référence d'environnement de ressource de ressource :
    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);
    ...

Icône indiquant le type de rubrique Rubrique Tâche

Nom du fichier : twlp_config_contextservice.html