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

Für Java™ EE-Anwendungen hat es sich bewährt, die direkte Verwaltung der eigenen Threads zu vermeiden. Daher bietet der ContextService eine Möglichkeit, einen zuvor erfassten Threadkontext für nicht verwaltete und verwaltete Threads zu erstellen. Bei diesem Vorgang wird jeder vorhandene Threadkontext überschrieben.

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.
Für z/OS-Plattformen
syncToOSThreadContext
Synchronisiert die Identität des RunAs-Subjekts für die Arbeitseinheit mit der Betriebssystemidentität.
Für z/OS-Plattformen
zosWLMContext
Wird zur Klassifizierung von Arbeit verwendet.

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>

Beispiel

Konfigurieren Sie Threadkontextserviceinstanzen 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>

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);
    ...

Symbol das den Typ des Artikels anzeigt. Taskartikel

Dateiname: twlp_config_contextservice.html