Caching für JAX-RPC-Web-Service-Clients konfigurieren

Der JAX-RPC-Web-Service-Clientcache (Java™ API for XML-Based Remote Procedure Calls) wird als "JAX-RPC-" Handler auf Ihrem Anwendungsserver bereitgestellt. Der Client für den JAX-RPC-Web-Service-Client ist Teil des dynamischen Cache-Service, der verwendet wird, um den Durchsatz von Web-Service-Clients durch Zwischenspeichern der Antworten von fernen Web-Services zu verbessern. Mit der Konfiguration des Cache für den JAX-RPC-Web-Service-Client können Sie die Leistung Ihres Anwendungsservers verbessern, weil die Antworten ferner Web-Services für einen bestimmten Zeitraum in den Cache gestellt werden.

Vorbereitende Schritte

Der dynamische Cache-Service ist standardmäßig aktiviert. Sie können die Standardcacheinstanz in der Administrationskonsole konfigurieren. Nähere Informationen finden Sie im Artikel Dynamischen Cacheservice verwenden. Bevor Sie den Web-Service-Client-Cache konfigurieren, müssen Sie sich mit dem Erstellen grundlegender Cacherichtlinien vertraut machen. Weitere Informationen hierzu finden Sie im Artikel Zwischenspeicherbare Objekte mit Datei cachespec.xml konfigurieren.

Informationen zu diesem Vorgang

Das Aktivieren des Web-Service-Client-Cache ist eine Möglichkeit, mit der Sie die Leistung Ihres Systems verbessern können. Wenn Sie diese Option verwenden, stellt der dynamische Cache-Service die Antworten ferner Web-Services für eine bestimmte Zeit in den Cache. In WebSphere Application Server Version 6.1 wird das Web-Service-Caching nur durch Aktivierung des dynamischen Cache-Service aktiviert. Sie aktivieren das Web-Service-Caching, indem Sie den dynamischen Cache-Service und das Servlet-Caching aktivieren. Wenn ein ferner Web-Service eine Antwort zurückgibt, wird die Antwort im Client-Cache des Anwendungsservers gespeichert. Alle identischen Anforderungen für denselben fernen Web-Service werden für einen definierten Zeitraum aus dem Cache beantwortet. Der Web-Service-Client-Cache stützt sich hauptsächlich auf zeitbasierte Invalidierungen, da sich der Ziel-Web-Service außerhalb des Unternehmensnetzes befinden kann und damit nichts vom Caching der Clientanforderungen weiß. Deshalb können Sie das Cachezeitlimit für Einträge und die Regeln für das Erstellen von IDs für Cacheeinträge in der Clientanwendung festlegen.

Der Web-Service-Client-Cache wird als JAX-RPC-Handler (Java API for XML-Based Remote Procedure Calls) in Ihrem Anwendungsserver bereitgestellt. Dieser JAX-RPC-Cache-Handler fängt die SOAP-Anforderungen ab, die von Anwendungsclients empfangen werden. Anschließend ermittelt er basierend auf dem Ziel-Web-Service eine Cacherichtlinie. Wenn er eine Richtlinie findet, werden alle Regeln für Cache-IDs nacheinander ausgewertet, bis eine gültige Regel gefunden wird.

Vorgehensweise

  1. Suchen Sie die WSDL-Datei (Web Services Description Language) für den fernen Service. Teile der WSDL-Datei enthalten Informationen, die Sie für das Erstellen Ihrer Cacherichtlinie benötigen. Weitere Informationen zu WSDL-Dateien finden Sie im Artikel WSDL. Das folgende Beispiel enthält Teile einer WSDL-Datei mit Werten, die zur Veranschaulichung dienen.
    <definitions targetNamespace="http://TradeSample.com/"
    		xmlns:tns="http://TradeSample.com/"
    		xmlns="http://schemas.xmlsoap.org/wsdl/"
    		xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    		xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<message name="getQuoteRequest">
    		<part name="symbol" type="xsd:string"/>
    	</message>
    .....
    .....
    <binding name="SoapBinding" type="tns:GetQuote">
    	<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    		<operation name="getQuote">
    			<soap:operation soapAction=""/>
    			<input name="getQuoteRequest">
    				<soap:body namespace="http://TradeSample.com/"
    				use="encoded"
    			encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    			</input>
    			......
    			</operation>
    </binding>
    <service name="GetQuoteService">
    	<port binding="tns:SoapBinding" name="SoapPort">
    		<soap:address location="http://TradeSample.com:9080/service/getquote"/>
    	</port>
    </service>
    </definitions>
    Der hervorgehobene Text enthält Werte, die Sie für das Schreiben Ihrer Cacherichtlinie verwenden können.
  2. Wählen Sie aus, wie die Cache-ID für den Web-Service-Client-Cache generiert werden soll. Für das Erstellen der Cache-ID-Regeln stehen die folgenden vier Optionen zur Verfügung:
    • Berechnung eines Hash-Wertes für den SOAPEnvelope
    • Verwendung von SOAPHeader-Einträgen
    • Verwendung der Parameter operation und part
    • Verwendung angepassten Java-Codes für die Erstellung der Cache-ID aus dem Inhalt der SOAP-Nachricht
    Empfohlen wird die Verwendung der SOAPHeader-Einträge, wenn Sie Informationen für das Erstellen von Cacheschlüsseln in den SOAP-Header einfügen können. Diese Methode erstellt einfach zu lesende Cacheschlüssel, die ohne Parsing des SOAP-Hauptteils (Body) erstellt werden können. Verwenden Sie eigenen Java-Code, um eine bestimmte Cache-ID auf der Basis der SOAP-Nachricht zu generieren. Falls Sie die Headerinformationen nicht einfügen können, haben Sie die Möglichkeit, den Hash-Wert des SOAPEnvelope zu berechnen, um eine bessere Leistung zu erzielen, oder den SOAP-Hauptteil (Body) zu parsen, um benutzerfreundliche Cacheschlüssel zu erstellen.
  3. Entwickeln Sie Ihre Cacherichtlinie.

    Alle Cacherichtlinien für Web-Service-Clients müssen die Klasse JAXRPCClient implementieren. Das Element name in jedem Cacheeintrag ist die Zielendpunktposition, die in der WSDL-Datei definiert ist. Sie finden diese Adresse in der WSDL-Datei im Tag <soap:address location=".."/> des Elements port. In der WSDL-Datei für dieses Beispiel ist die Adresse http://TradeSample.com:9080/service/getquote. Verwenden Sie eine der folgenden Optionen, um den Rest der Cacherichtlinie zu entwickeln:

    • Hash-Wert des SOAPEnvelope berechnen, um die Anforderung zu identifizieren
      <cache>
      	<cache-entry>
      		<class>JAXRPCClient</class>
      		<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      			<component id="hash" type="SOAPEnvelope"/>
      			<timeout>60</timeout>
      		</cache-id>
      	</cache-entry>
      </cache>

      Sie müssen das Attribut component angeben, um eine Cache-ID basierend auf einer Hash-Berechnung des SOAPEnvelope zu erstellen. Die generierte Cache-ID für dieses Beispiel ist http://TradeSample.com:9080/service/getquote:Hash=xxxHashSoapEnvelope.

    • SoapHeader für die Identifizierung der Anforderung verwenden
      <cache>
      	<cache-entry>
      		<class>JAXRPCClient</class>
      		<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      			<component id="urn:stock:getQuote" type="SOAPHeaderEntry"/>
      		</cache-id>
      	</cache-entry>
      </cache>

      Diese Cache-ID wird anhand spezieller Informationen aus dem SOAP-Header erstellt, um Anforderungen für Einträge im Cache zu identifizieren. Geben Sie für type den Wert SOAPHeaderEntry und für id den Namen der Operation aus dem Element binding in der WSDL-Datei an. Die generierte Cache-ID für dieses Beispiel ist http://TradeSample.com:9080/service/getquote:urn:stock:getQuote=IBM.

      Es folgt ein Beispiel für eine SOAP-Anforderung, die von einem Client mit einem SOAP-Header generiert wird:

      Beachten Sie, dass das Attribut soapenv:actor den Wert com.ibm.websphere.cache enthalten muss.
      POST /wsgwsoap1/soaprpcrouther HTTP/1.1
      SOAPAction: ""
      Context-Type: text/xml; charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Content-Length: 645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header>
      	<getQuote soapenv:actor="com.ibm.websphere.cache" xmlns="urn:stock">IBM</getQuote>
      </soapenv:Header>
      <soapenv:Body
      soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
      	<getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      		<symbol xsi:type="xsd:string">IBM</symbol>
      	</getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
    • Parameter operation und part für die Identifizierung der Anforderung verwenden
      <cache>
      	<cache-entry>
      		<class>JAXRPCClient</class>
      		<name>http://TradeSample.com:9080/service/getquote</name>
      		<cache-id>
      			<component id="" type="operation">
      				<value>http://TradeSample.com/:getQuote</value>
      			</component>
      			<component id="symbol" type="part"/>
      		</cache-id>
      	</cache-entry>
      </cache>

      Dieses Beispiel verwendet die Parameter "operation" und "request". Der Parameter operation kann ein Methodenname aus der WSDL-Datei im Element binding oder ein Methodenname im Document/Literal Invocation (DII) sein. Wenn der Namespace der Operation definiert ist, hat der Wert das folgende Format: NamespaceDerOperation:NameDerOperation. Der Typ von part kann als Anforderungsparameter im Element message der WSDL-Datei oder als Anforderungsparameter in DII definiert werden. Das Attribut id ist der Name des Nachrichtenabschnitts oder Parameters und das Attribut value der Wert des Nachrichtenabschnitts oder Parameters. Die bei Verwendung des Anforderungsparameters "operation" generierte Cache-ID ist http://TradeSample.com:9080/service/getquote:operation=http://TradeSample.com/:getQuote/symbol=IBM.

      Im Folgenden sehen Sie ein Beispiel für die SOAP-Anforderung, die der Client mit den Parametern "operation" und "part" generiert:

      POST /wsgwsoap1/soaprpcrouter HTTP/1.1
      SOAPAction:""
      Content-Type: text/xml/charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Current-Length: 645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns: soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      	xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body
      	soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      	<getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      		<symbol xsi:type="xsd:string">IBM</symbol>
      	</getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
    • Mit angepasstem Java-Code die Cache-ID aus dem Inhalt der SOAP-Nachricht erstellen

      Wenn Sie eigenen Java-Code verwenden, um die Cache-ID zu erstellen, müssen Sie eine Java-Klasse als ID-Generator verwenden, die die im Paket com.ibm.websphere.cache.webservices.IdGenerator definierte Schnittstelle "IdGenerator" implementiert, und der Datei "cachespec.xml" mit dem Tag idgenerator eine Referenz auf die erstellte Klasse hinzufügen.

      Sie können auch das Paket "com.ibm.websphere.cache.webservices.MetaDataGenerator" implementieren, um den Cacheeinträgen mit dem Tag metadatagenerator Cachemetadaten wie Zeitlimit, Priorität und Abhängigkeits-IDs zuzuordnen.

      Implementieren Sie die Schnittstelle "com.ibm.websphere.cache.webservices.InvalidationGenerator" und verwenden Sie das Tag invalidationgenerator in der Datei cachespec.xml, um Cache-IDs zu generieren und Einträge im Cache ungültig zu machen. Die vom Invalidierungsgenerator generierte ID kann eine Cache-ID oder eine Abhängigkeits-ID sein.

      Wenn Sie beispielsweise eine ID-Generatorklasse mit dem Namen SampleIdGeneratorImpl, eine Generatorklasse für Metadaten mit dem Namen "SampleMetaDataGeneratorImpl" und eine Generatorklasse für Invalidierungen mit dem Namen "SampleInvalidationGeneratorImpl" erstellen, kann Ihre Datei "cachespec.xml" folgenden Inhalt haben:

      <cache-entry>
      	<class>JAXRPCClient</class>
      	<name>http://TradeSample.com:9080/service/getquote</name>
      	<cache-id>
      		<idgenerator>com.mycompany.SampleIdGeneratorImpl</idgenerator>
      		<metadatagenerator>
             com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
          </metadatagenerator>
      		<timeout>60</timeout>
      	</cache-id>
      	<invalidation>http://TradeSample.com:9080/service/GetQuote
      		<invalidationgenerator>
             com.mycompany.SampleMetaDataAndInvalidationGeneratorImpl
          </invalidationgenerator>
      	</invalidation>
      </cache-entry>
      Die Klasse "SampleIdGeneratorImpl" ist eine angepasste Java-Klasse, die die Schnittstelle com.websphere.cache.webservices.IdGenerator implementiert. Die Klasse "SampleIdGeneratorImpl" enthält die Methode "getID":
      String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      Im Folgenden sehen Sie ein Beispiel für die Klasse "SampleIdGeneratorImpl.java".

      public class SampleIdGeneratorImpl implements IdGenerator {
      //The SampleIdGenerator class builds cache keys using SOAP header entries
          public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext
      			messageContext) {
      			....
      			// retrieve SOAP header entries from SOAPMessage
      			SOAPHeader sh = soapEnvelope.getHeader();
      	   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   		SOAPHeaderElement element =
      			              (SOAPHeaderElement)it.next();
      					Name name = element.getElementName();
      					String headerEntryName = name.getLocalName();
      					if (headerEntryName.equals("getQuote")){
      						String sNamespace = element.getNamespaceURI("");
      						if (sNamespace != null && !sNamespace.equals("")) {
      		    				headerEntryName = sNamespace + ":" + headerEntryName;
      							String quotes = element.getValue();
      						}
      						...
      						...
      						// create a method "parseAndSort" to parse and sort quotes
      						// By parsing and sorting quotes, you avoid duplicate cache
      						// entries.
      						// quotes e.g. IBM,CSCO,MSFT,INTC
      						// to return a cache key "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
      						String sortQuotes = parseAndSort(quotes);
      						cacheKey = headerEntryName + "=" + sortQuotes;
      	   			}
      				}
      		return cacheKey;
      		}
      	}

      Die generierte Cache-ID für dieses Beispiel ist http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.

      Die Klasse SampleMetaDataAndInvalidationGeneratorImpl ist eine angepasste Java-Klasse, die die Schnittstellen com.websphere.cache.webservices.MetaDataGenerator und com.websphere.cache.webservices.InvalidationGenerator. Die Klasse SampleMetaDataAndInvalidationGeneratorImpl enthält die Methoden setMetaData und getInvalidationIds. Sie können anstelle einer großen Klasse auch zwei kleinere Klassen konfigurieren. Beispielsweise können Sie eine Klasse für den Metadatengenerator und eine andere Klasse für den Invalidationsgenerator erstellen. Im Folgenden sehen Sie Prototypen für die Methode setMetaData und die Methode getInvalidationIds:

      void setMetaData (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, 
      		com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo)
      String[] getInvalidationIds (javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      Es folgt ein Beispiel für die Klasse SampleMetaDataAndInvalidationGeneratorImpl.java:

      public class SampleMetaDataAndInvalidationGeneratorImpl implements MetaDataGenerator, InvalidationGenerator {
          //assigns time limit, and priority metadata
          public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
      			....
                      
      		// retrieve SOAP header entries from SOAPMessage
      			SOAPHeader sh = soapEnvelope.getHeader();
      	   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   		SOAPHeaderElement element =
      			              (SOAPHeaderElement)it.next();
      					Name name = element.getElementName();
      					String headerEntryName = name.getLocalName();
      	                                if (headerEntryName.equals(“metadata”)) {
      					// retrieve each metadata element and set metadata
      	                entryInfo.setTimeLimit(timeLimit);
                      entryInfo.setPriority(priority);
                  }
              }
          }
      
          //builds invalidation ids using SOAP header.
          public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext) {			....
      			// retrieve SOAP header entries from SOAPMessage
                      String[] invalidationIds = new String[1];
      			SOAPHeader sh = soapEnvelope.getHeader();
      	   	if (sh != null) {
      				Iterator it = sh.examineHeaderElements("com.mycompany.actor");
      				while (it.hasNext()) {
      		   		SOAPHeaderElement element =
      			              (SOAPHeaderElement)it.next();
      					Name name = element.getElementName();
      					String headerEntryName = name.getLocalName();
      	                                if (headerEntryName.equals("invalidation")) {
      					String sNamespace = element.getNamespaceURI("");
      					if (sNamespace != null && !sNamespace.equals("")) {
      		    			headerEntryName = sNamespace + ":symbol";
      						String quotes = element.getValue();
      					}
      					...
      					...
      					// create a method "parseAndSort" to parse and sort quotes
      					// By parsing and sorting quotes, you avoid duplicate cache
      					// entries.
      					// quotes e.g. SUNW,NT
      					// to return a cache key "urn:stock:symbol=NT,SUNW"
      					String sortQuotes = parseAndSort(quotes);
      					invalidationIds[0] = headerEntryName + "=" sortQuotes;
                   }
      	   	}
      		return invalidationIds;
          }
      }
      
      Die für dieses Beispiel generierte Invalidierungs-ID ist
      http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW

      Es folgt ein Beispiel für die SOAP-Anforderung, die vom Client generiert wird, wenn angepasster Java-Code verwendet wird:

      POST /wsgwsoap1/soaprpcrouter HTTP/1.1
      SOAPAction: ""
      Context-type: text/xml, charset=utf-8
      User-Agent: Java/1.4.1
      Host: localhost
      Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
      Connection: keep-alive
      Content-Length:645
      
      <?xml version="1.0" encoding="UTF-8"?>
      <soapenv:Envelope
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      		xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
      		xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Header>
      		<getQuote soapenv:actor="com.mycompany.actor"
      			xmlns="urn:stock">IBM,CSCO,MSFT,INTC</getQuote>
      		<metaData soapenv:actor="com.mycompany.actor" xmlns="urn:stock">
      			<priority>10</priority>
      			<timeLimit>30000</timeLimit>
      		</metaData>
      		<invalidation soapenv:actor="com.mycompany.actor"
      			xmlns="urn:stock">SUNW, NT</invalidation>
      </soapenv:Header>
      <soapenv:Body
      soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding">
      <getQuote xmlns="urn:ibmwsgw#GetQuoteSample">
      	<symbol xsi:type="xsd:string">IBM,CSCO,MSFT,INTC</symbol>
      </getQuote>
      </soapenv:Body>
      </soapenv:Envelope>
  4. Speichern Sie die Cacherichtlinie im entsprechenden Verzeichnis.
    • Wenn Sie das Web-Service-Gateway in SOAP-Kanal 1 verwenden, lautet das Verzeichnis <Stammverzeichnis_des_Anwendungsservers>\installedApps\wsgwsoap1.Servername.Knotenname.ear/wsgwsoap.war/WEB-INF.
    • Wenn Sie in Ihrer Anwendung einen einfachen JAX-RPC-Client für den Aufruf ferner Web-Services verwenden, speichern Sie die Cacherichtlinie im Webmodulverzeichnis WEB-INF Ihrer JAX-RPC-Anwendung.

Ergebnisse

Sie können die Ergebnisse der Richtlinie für den Web-Service-Client-Cache mit dem dynamischen Cachemonitor überwachen. Weitere Informationen hierzu finden Sie im Artikel Cachedaten anzeigen.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdyn_wsclientcache
Dateiname:tdyn_wsclientcache.html