Instanzen des Threadkontextservice konfigurieren
Sie können ContextService-Instanzen konfigurieren, um einen verwalteten Threadkontext aufzuzeichnen und ihn auf Aufrufe von angegebenen Schnittstellenmethoden für einen Thread anzuwenden.
Informationen zu diesem Vorgang
Eine Standardinstanz des Threadkontextservice (DefaultContextService) wird vom Server erstellt und so konfiguriert, dass mindestens die Elemente classloaderContext, jeeMetadataContext und securityContext erfasst und weitergegeben werden. Sie können die Threadkontextweitergabe so konfigurieren, dass die folgenden Threadkontexttypen einbezogen werden:
- classloaderContext
- Macht das Klassenladeprogramm, der vom Übergebenden der Task verwendet wird, für die Task verfügbar. Wenn der Kontextklassenlader serialisiert wird, muss er ein Threadkontextklassenlader aus der Anwendung sein. Die Klassenladerserialisierung für OSGi-Webanwendungsbundles wird gegenwärtig nicht unterstützt.
- jeeMetadataContext
- Macht den Namespace der Anwendungskomponente, die die verfügbare Task übergeben hat, für die Task verfügbar.
- securityContext
- Sie müssen das Feature appSecurity-2.0 in der Datei server.xml aktivieren, um diesen Threadkontexttyp zu verwenden. Macht das Caller-Subjekt und das Aufrufsubjekt des Übergebenden der Task für die Task verfügbar. Dazu wird unter Verwendung eines JAAS-Anmeldemoduls eine Anmeldung mit dem WSPrincipal des Übergebenden durchgeführt. Im Abschnitt Einschränkungen des Features concurrent-1.0 wird ausführlich beschrieben, welche Informationen im Subjekt des Übergebenden nicht im Sicherheitskontext enthalten sind.
Vorgehensweise
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Beispiel
- Threadkontextservice, der in JNDI mit dem Namen concurrent/threadContextSvc1 registriert ist und nur jeeMetadataContext erfasst und weiterleitet:
<contextService id="threadContextSvc1" jndiName="concurrent/${id}"> <jeeMetadataContext/> </contextService>
- Threadkontextservice mit classloaderContext und securityContext:
<contextService jndiName="concurrent/threadContextSvc2"> <classloaderContext/> <securityContext/> </securityContext/>
- Threadkontextservice, der jeeMetadataContext von threadContextSvc1 übernimmt und securityContext hinzufügt:
<contextService jndiName="concurrent/threadContextSvc3" baseContextRef="threadContextSvc1"> <securityContext> </contextService>
Beispiel, das den Standardkontextservice sucht:
ContextService threadContextSvc =
(ContextService) new InitialContext().lookup(
"java:comp/DefaultContextService");
myContextualAsyncCallback = threadContextSvc.createContextualProxy(
myAsyncCallback, MyAsyncCallback.class);
doSomethingAsync(arg1, arg2, myContextualAsyncCallback);
Beispiele für das Einfügen von Instanzen eines Threadkontextservice in Anwendungskomponenten (mit @Resource) oder für die Suche mit Ressourcenumgebungsreferenzen (resource-env-ref).
- Beispiel, in dem
@Resource verwendet wird:
@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; } }; // Threadkontext der aktuellen Anwendungskomponente erfassen execProps = Collections.singletonMap(ManagedTask.TRANSACTION, ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD); processSalesOrderCompletion = (Callable<Boolean>) threadContextSvc1.createContextualProxy(processSaleCompletion, execProps, Callable.class); // später von einer anderen Anwendungskomponente tran.begin(); ... successful = processSalesOrderCompletion.call(); if (successful) tran.commit();else tran.rollback();
- Beispiel, das
resource-env-ref in der Datei web.xml angibt:
<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>
- Beispielsuche, die die Ressourcenumgebungsreferenz verwendet:
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); ...