![[8.5.5.4 oder höher]](../ng_v8554.gif)
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
Vorgehensweise
Aktivieren Sie den Threadkontextservice in der Datei server.xml. Der Threadkontextservice ist unter dem Feature <concurrent-1.0> verfügbar.
<featureManager>
<feature>concurrent-1.0</feature>
</featureManager>
Ergebnisse
Eine Standardinstanz des Threadkontextservice (DefaultContextService) wird vom Server erstellt und so konfiguriert, dass mindestens 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 des Threadkontextes, 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 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 eine JAAS-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.
Wichtig: Zusätzliche Threadkontextprovider können durch Features in Zusatzprodukten verfügbar gemacht werden. Das optionale baseContextRef-Attribut ermöglicht einer Kontextserviceinstanz, Daten aus der Kontextkonfiguration einer anderen Kontextserviceinstanz zu übernehmen.
Beispiel
Sie können Instanzen eines Threadkontextservice in Anwendungskomponenten injizieren (mit @Resource) oder mit Ressourcenumgebungsreferenzen (resource-env-ref) ermitteln.
- Beispielkonfiguration in der Datei server.xml:
- 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>
- Threadkontextservice, der in JNDI mit dem Namen concurrent/threadContextSvc1 registriert ist und nur jeeMetadataContext erfasst und weiterleitet:
- 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 für die Verwendung von
resource-env-ref in der Datei web.xml file:
<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); ...