Configuration de la mémoire cache du client des services Web JAX-RPC.

Le cache client des services Web JAX-RPC est fourni en tant que gestionnaire de l'"API Java™ pour les appels de procédure éloignée basés sur XML (JAX-RPC)" sur votre serveur d'applications. Le cache client des services Web JAX-RPC fait partie du service de cache dynamique destiné à accroître les performances des clients des services Web en mettant en cache les réponses émanant de services Web distants. La configuration de la mémoire cache du client des services Web JAX-RPC permet d'améliorer les performances de votre serveur d'applications en mettant en cache les réponses émanant de services Web distants pour une durée précise.

Avant de commencer

Le service de cache dynamique est activé par défaut. Vous pouvez configurer l'instance de cache par défaut dans la console d'administration. Pour plus d'informations, voir Utilisation du service de cache dynamique. Avant de tenter de configurer la mémoire cache du client des services Web, il est nécessaire de comprendre la façon dont sont créées les règles de base de la mémoire cache. Pour plus d'informations, voir Configuration des objets pouvant être mis en cache à l'aide du fichier cachespec.xml.

Pourquoi et quand exécuter cette tâche

L'activation de la mémoire cache du client des services Web permet d'améliorer les performances de votre système en utilisant le service de cache dynamique pour sauvegarder les réponses émanant de services Web distants pour une durée précise. Avec la version 6.1 de WebSphere Application Server, vous lancez la mise en cache des services Web en activant uniquement le service de cache dynamique. Vous lancez la mise en cache des services Web en activant le service de cache dynamique et la mise en cache des servlets. Une réponse renvoyée par un service Web distant est sauvegardée dans le cache du client sur le serveur d'applications. Toutes les demandes identiques soumises au même service Web distant sont alors extraites du cache pour une période donnée. Le cache du client des services Web s'appuie principalement sur des invalidations périodiques, car il se peut que le service Web cible se trouve hors de votre réseau d'entreprise et ignore donc l'existence de la mise en cache client que vous pratiquez. Par conséquent, dans votre application client, vous pouvez indiquer la durée de conservation dans le cache et les règles de création des ID d'enregistrements du cache.

Le cache client des services Web est fourni en tant que gestionnaire de l'API Java pour les appels de procédure éloignée basés sur XML (JAX-RPC) dans votre serveur d'applications. Ce gestionnaire de cache JAX-RPC intercepte les demandes SOAP qu'il reçoit d'applications client. Il identifie une règle de cache basée sur le service Web cible. Quand une règle est trouvée, toutes les règles d'ID cache sont évaluées une à une jusqu'à ce qu'une règle valide soit détectée.

Procédure

  1. Localisez le fichier WSDL (Web Services Description Language) du service distant. Le fichier WSDL se compose d'éléments que vous utiliserez lors de l'écriture de la règle de cache. Pour plus d'informations sur les fichiers WSDL, voir WSDL. Voici un fragment de fichier WSDL dont les valeurs sont utilisées pour la démonstration.
    <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>
    Le texte mis en évidence comporte de valeurs utilisées pour l'écriture de votre règle de cache.
  2. Choisissez la façon de générer l'ID de cache pour la mise en cache du client des services Web. Pour créer vos règles d'ID de cache, vous pouvez :
    • Calculer un hachage de l'instance SOAPEnvelope
    • Utiliser des entrées SOAPHeader
    • Utiliser des paramètres de fonctionnement et d'élément
    • Utiliser le code Java personnalisé pour créer l'ID de cache à partir du contenu du message SOAP en entrée
    L'utilisation d'entrées SOAPHeader est la meilleure option si vous pouvez inclure des informations dans le cadre de la création de clés de cache dans l'entête SOAP. Cette méthode génère des clés de cache faciles à lire et ne nécessite pas l'analyse du corps du code SOAP. Utilisez le code Java personnalisé pour générer un ID de cache spécifique basé sur le message SOAP. S'il vous est impossible d'inclure des informations d'entête, vous pouvez calculer le hachage de SOAPEnvelope pour les performances ou analyser le code du message SOAP pour des clés de cache conviviale.
  3. Développez votre règle de cache.

    Toutes les règles de cache du client des services Web doivent posséder la classe JAXRPCClient. L'élément name de chaque entrée de cache correspond à l'emplacement du point d'extrémité cible du fichier WSDL. Cette adresse est disponible dans le fichier WSDL, à la ligne <soap:address location=".."/> situé dans l'élément port. Dans le fichier WSDL de cet exemple, l'adresse est http://TradeSample.com:9080/service/getquote. Développez le reste de la règle du cache en utilisant l'une des options suivantes :

    • Calculez un hachage de SOAPEnvelope pour identifier la demande
      <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>

      Notez les attributs component destinés à créer un ID de cache basé sur un calcul de hachage du message SOAPEnvelope. L'ID de cache de cet exemple est généré en tant que http://TradeSample.com:9080/service/getquote:Hash=xxxHashSoapEnvelope.

    • Utilisez SoapHeader pour identifier la demande
      <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>

      Cet ID de cache est créer à partir d'informations spéciales de l'en-tête SOAP pour identifier des demandes d'entrées du cache. Attribuez SOAPHeaderEntry en tant que type et id en tant que nom d'operation situé dans l'élément binding du fichier WSDL. L'ID de cache de cet exemple est généré en tant que http://TradeSample.com:9080/service/getquote:getQuote=IBM.

      Exemple de demande SOAP généré par le client utilisant l'entête SOAP :

      Notez que l'attribut soapenv:actor doit contenir com.ibm.websphere.cache.
      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>
    • Identifiez la demande à l'aide de operation et part
      <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>

      Cet exemple utilise des paramètres operation et request. operation peut être un nom de méthode du fichier WSDL situé dans l'élément binding ou un nom de méthode de DII (Document/Literal Invocation). Si l'espace de nom de l'opération est défini, la valeur est formatée en tant que EspaceNomDeOpération:nomDeOpération. Le type part peut être défini dans l'élément message du fichier WSDL, en tant que paramètre de demande ou en tant que paramètre de demande de l'appel DII. Son attribut id est le nom de partie ou de paramètre et value correspond à la valeur de la partie ou du paramètre. L'ID de cache généré pour l'utilisation des paramètres operation et request est http://TradeSample.com:9080/service/getquote:operation=http://TradeSample.com/:getQuote/symbol=IBM.

      Exemple de demande SOAP généré par le client utilisant operation et part :

      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>
    • Utilisez le code Java personnalisé pour créer l'ID de cache à partir du contenu du message SOAP en entrée

      Si vous utilisez le code Java personnalisée pour créer l'ID de cache, créez une classe Java pour le générateur d'ID qui implémente l'interface IdGenerator définie dans le package com.ibm.websphere.cache.webservices.IdGenerator et ajoutez une référence à la classe que vous créez dans le fichier cachespec.xml en utilisant la balise idgenerator.

      Vous pouvez également implémenter le package com.ibm.websphere.cache.webservices.MetaDataGenerator de façon à affecter les métadonnées de cache, telles que le délai d'attente, la priorité et les ID de dépendance, aux entrées de cache à l'aide de la balise metadatagenerator.

      Implémentez l'interface com.ibm.websphere.cache.webservices.InvalidationGenerator et utilisez la balise invalidationgenerator dans le fichier cachespec.xml pour générer des ID de cache et invalider des entrées du cache. L'ID généré par le générateur d'invalidation peut être un ID de cache ou un ID de dépendance.

      Par exemple, si vous développez une classe de générateur d'ID nommée SampleIdGeneratorImpl, une classe de générateur de métadonnées nommée SampleMetaDataGeneratorImpl, et une classe de générateur d'invalidation nommée SampleInvalidationGeneratorImpl, votre fichier cachespec.xml contiendra ce qui suit :

      <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>
      La classe SampleIdGeneratorImpl est une classe Java personnalisée qui implémente l'interface com.websphere.cache.webservices.IdGenerator . La classe SampleIdGeneratorImpl contient la méthode getID :
      String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      Voici l'exemple de la classe 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;
      		}
      	}

      L'ID de cache de cet exemple est généré en tant que http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.

      La classe SampleMetaDataAndInvalidationGeneratorImpl est une classe Java personnalisée qui implémente l'interface com.websphere.cache.webservices.MetaDataGenerator et l'interface com.websphere.cache.webservices.InvalidationGenerator. La classe SampleMetaDataAndInvalidationGeneratorImpl contient la méthode setMetaData et la méthode getInvalidationIds. Vous pouvez également configurer deux classes de taille inférieure au lieu de cette classe de grande taille. Par exemple, créez une classe pour le générateur de métadonnées et une classe différente pour le générateur d'invalidation. Voici les prototypes des méthodes setMetaData et 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)

      Voici un exemple de classe 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;
          }
      }
      
      L'ID d'invalidation de cet exemple est généré en tant que :
      http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW

      Exemple de demande SOAP généré par le client à l'aide du code Java personnalisé :

      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. Enregistrez la règle de cache dans le répertoire approprié.
    • Si vous utilisez la passerelle des services Web sur le canal SOAP 1, le répertoire est : <racine_serveur_app>\installedApps\wsgwsoap1.nomserveur.nomnoeud.ear/wsgwsoap.war/WEB-INF
    • Si vous utilisez un client JAX-RPC simple dans votre application pour appeler des services Web distants, enregistrez votre règle de cache dans le module Web WEB-INF de l'application JAX-RPC.

Résultats

Vous pouvez contrôler les résultats de la règle de cache du client des services Web en utilisant le moniteur de cache dynamique. Pour plus d'informations, voir Affichage des informations de cache.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdyn_wsclientcache
Nom du fichier : tdyn_wsclientcache.html