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
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
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Exemple
- 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); ...