[8.5.5.4 oder höher]

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.

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. Liberty-Repository[8.5.5.4 oder höher]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
[8.5.5.4 oder höher] 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>
  • 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);
    ...

Symbol das den Typ des Artikels anzeigt. Taskartikel

Nutzungsbedingungen für Information Center | Feedback


Symbol für Zeitmarke Letzte Aktualisierung: 25.08.2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_config_contextservice
Dateiname: twlp_config_contextservice.html