![[8.5.5.4 ou ultérieure]](../ng_v8554.gif)
Configuration des instances de service de 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
Procédure
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Résultats
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 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 du contexte de l'unité d'exécution 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 d'unité d'exécution de l'application. La sérialisation de chargeur de classe pour les bundles d'applications Web 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. Rendez le sujet d'appelant et le sujet d'appel de l'émetteur de la tâche disponibles pour celle-ci. Pour cela, connectez-vous avec le WSPrincipal de l'émetteur en utilisant une 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.
Exemple
Injectez des instances de services de contexte d'unité d'exécution dans des composants d'application (à l'aide de @Resource) ou recherchez avec des références d'environnement de ressource (resource-env-ref).
- Exemple de configuration 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>
- Service de contexte d'unité d'exécution qui est
enregistré dans JNDI sous le nom concurrent/threadContextSvc1,
qui capture et propage jeeMetadataContext
uniquement :
- 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 utilise 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); ...