Configuración de la memoria caché del cliente de servicios web JAX-RPC

La memoria caché del cliente de servicios web JAX-RPC se proporciona como un manejador de API "Java™ para llamadas de procedimiento remotas basadas en XML (JAX-RPC)" en el servidor de aplicaciones. La memoria caché del cliente de servicios web JAX-RPC forma parte del servicio de memoria caché dinámica que se utiliza para aumentar el rendimiento de los clientes de servicios web almacenando en memoria caché las respuestas de los servicios web remotos. La configuración de la memoria caché del cliente de servicios web JAX-RPC puede mejorar el rendimiento del servidor de aplicaciones, colocando en memoria caché las respuestas de los servicios web remotos durante un periodo de tiempo especificado.

Antes de empezar

El servicio de memoria caché dinámica está habilitado de manera predeterminada. Puede configurar la instancia de memoria caché predeterminada en la consola administrativa. Para obtener más información, consulte el apartado Utilización del servicio de memoria caché dinámica. Antes de intentar configurar la memoria caché del cliente de servicios web, entienda cómo crear políticas de memoria caché básicas. Consulte Configuración de objetos en memoria caché con el archivo cachespec.xml para obtener más información.

Acerca de esta tarea

La habilitación de la memoria caché del cliente de servicios web es una opción para mejorar el rendimiento del sistema mediante la utilización del servicio de memoria caché dinámica con el fin de guardar las respuestas de los servicios web remotos durante un periodo de tiempo especificado. Con WebSphere Application Server Versión 6.1, se habilita el almacenamiento en memoria caché de servicios web habilitando sólo el servicio de memoria caché dinámica. El almacenamiento en memoria caché de servicios web se habilita habilitando el servicio de memoria caché dinámica y el almacenamiento en memoria caché de servlet. Cuando se devuelve una respuesta de un servicio web remoto, ésta se guarda en la memoria caché del cliente en el servidor de aplicaciones. Las solicitudes idénticas que se realizan al mismo servicio web remoto se responden posteriormente desde la memoria caché durante un período de tiempo especificado. La memoria caché del cliente de servicios web se basa principalmente en invalidaciones dependientes del tiempo, ya que el servicio web de destino puede estar fuera de la red de empresa y desconocer la memoria caché del cliente. Por lo tanto, puede especificar la cantidad de tiempo en la memoria caché y las reglas para crear ID de entrada de memoria caché en la memoria caché de la aplicación cliente.

La memoria caché del cliente de servicios web se proporciona como un manejador JAX-RPC (API Java para llamadas de procedimientos remotos basadas en XML) en el servidor de aplicaciones. Este manejador de memoria caché JAX-RPC intercepta las solicitudes SOAP que fluyen por él desde los clientes de aplicaciones. A continuación, identifica una política de memoria caché basada en el servicio web de destino. Una vez encontrada una política, todas las reglas de ID de memoria caché se evalúan una a una hasta que se detecta una regla válida.

Procedimiento

  1. Localice el archivo WSDL (Web Services Description Language) para el servicio remoto. Partes del archivo WSDL contienen información que utilizará al escribir la política de memoria caché. Para obtener más información sobre los archivos WSDL, consulte WSDL. A continuación aparece un ejemplo de las partes de un archivo WSDL que contiene los valores que se utilizan con fines ilustrativos.
    <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>
    El texto resaltado indica los valores que se utilizan al escribir la política de memoria caché.
  2. Elija cómo tiene pensado generar el ID de memoria caché para el almacenamiento en memoria caché de cliente de servicios web. Puede crear las reglas del ID de memoria caché utilizando una de las cuatro opciones siguientes:
    • Calculando un hash de SOAPEnvelope
    • Utilizando entradas SOAPHeader
    • Utilizando parámetros part y operation
    • Utilizando el código Java personalizado para crear el ID de memoria caché a partir del contenido de mensaje SOAP de entrada.
    La utilización de entradas SOAPHeader es la mejor opción, si puede incluir información para construir claves de memoria caché como parte de la cabecera SOAP. Este método crea claves de memoria caché fáciles de leer y se puede crear sin analizar el cuerpo SOAP. Utilice código Java personalizado para generar un ID de memoria caché especificada basado en el mensaje SOAP. Si no puede incluir la información de cabecera, puede calcular el hash de SOAPEnvelope para el rendimiento o analizar el cuerpo SOAP para las claves de memoria caché fáciles de usar por el usuario.
  3. Desarrolle la política de memoria caché.

    Todas las políticas de memoria caché de cliente de servicios web deben tener la clase JAXRPCClient. El elemento name de todas las entradas de memoria caché es la ubicación de punto final de destino que se define en el archivo WSDL. Puede encontrar esta dirección en el archivo WSDL buscando la etiqueta <soap:address location=".."/> código ubicado en el elemento port. En el archivo WSDL para este ejemplo, la dirección es http://TradeSample.com:9080/service/getquote. Desarrolle el resto de la política de memoria caché mediante una de las siguientes opciones:

    • Calcule un hash de SOAPEnvelope para identificar la solicitud
      <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>

      Tenga en cuenta los atributos component para crear un ID de memoria caché basado en un cálculo de SOAPEnvelope. El ID de memoria caché para este ejemplo se genera como http://TradeSample.com:9080/service/getquote:Hash=xxxHashSoapEnvelope.

    • Utilice SoapHeader para identificar la solicitud
      <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>

      Este ID de memoria caché se construye mediante la información especial de la cabecera SOAP para identificar las solicitudes para las entradas de la memoria caché. Especifique type como SOAPHeaderEntry e id como el nombre de operation ubicado en el elemento binding del archivo WSDL. El ID de memoria caché de este ejemplo se genera como http://TradeSample.com:9080/service/getquote:urn:stock:getQuote=IBM.

      Ejemplo de una solicitud SOAP generada por el cliente mediante la cabecera SOAP:

      Tenga en cuenta que el atributo soapenv:actor debe contener 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>
    • Utilice los parámetros operation y part para identificar la solicitud
      <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>

      Este ejemplo utiliza los parámetros operation y request. operation puede ser un nombre de método del archivo WSDL situado en el elemento binding o un método de nombre de DII (Document/Literal Invocation). Si el espacio de nombres de la operación está definido, el valor tendrá el formato namespaceOfOperation:nameOfOperation. El tipo part se puede definir en el elemento message del archivo WSDL, como un parámetro request o bien como un parámetro request de la invocación DII. El atributo id es el nombre de parámetro o parte y value es el valor de parámetro o parte. El ID de memoria caché generado al utilizar los parámetros operation y request es http://TradeSample.com:9080/service/getquote:operation=http://TradeSample.com/:getQuote/symbol=IBM.

      Ejemplo de la solicitud SOAP generada por el cliente mediante los parámetros operation y 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>
    • Utilice el código Java personalizado para crear el ID de memoria caché a partir del contenido del mensaje SOAP de entrada

      Si utiliza el código Java personalizado para crear el ID de memoria caché, cree una clase Java de generador de ID que implemente la interfaz IdGenerator definida en el paquete com.ibm.websphere.cache.webservices.IdGenerator y añadir una referencia a la clase creada en el archivo cachespec.xml utilizando el distintivo idgenerator.

      También puede implementar el paquete com.ibm.websphere.cache.webservices.MetaDataGenerator para asignar metadatos de memoria caché como los ID de tiempo de espera, prioridad y dependencia a las entradas de memoria caché con el código metadatagenerator.

      Implemente la interfaz com.ibm.websphere.cache.webservices.InvalidationGenerator y utilice el código invalidationgenerator en el archivo cachespec.xml para generar ID de memoria caché y para invalidar entradas en la memoria caché. El ID generado por el generador de invalidación puede ser un ID de memoria caché o un ID de dependencia.

      Por ejemplo, si desarrolla una clase de generador de ID llamado SampleIdGeneratorImpl, una clase de generador de metadatos denominada SampleMetaDataGeneratorImpl y una clase de generador de invalidación denominada SampleInvalidationGeneratorImpl, el archivo cachespec.xml puede contener lo siguiente:

      <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 clase SampleIdGeneratorImpl es una clase Java personalizada que implementa la interfaz com.websphere.cache.webservices.IdGenerator. La clase SampleIdGeneratorImpl contiene el método getID:
      String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      A continuación aparece in ejemplo de la clase SampleIdGeneratorImpl.java.

      public class SampleIdGeneratorImpl implements IdGenerator {
      //La clase SampleIdGenerator crea claves de memoria caché mediante entradas de cabecera SOAP
          public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext 
      			messageContext) {
      			....
      			// recuperar entradas de cabecera SOAP a partir de 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();
      						}
      						...
      						...
      						// crear un método "parseAndSort" para analizar y clasificar cotizaciones
      						// Al analizar y clasificar cotizaciones, evita que en la memoria caché se dupliquen 
      						// las entradas.
      											// cotizaciones, por ejemplo IBM,CSCO,MSFT,INTC
      						// para devolver una clave de memoria caché "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
      						String sortQuotes = parseAndSort(quotes); 
      						cacheKey = headerEntryName + "=" + sortQuotes;
      	   			}
      				}
      		return cacheKey;
      		}
      	}

      El ID de memoria caché para este ejemplo se genera como http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.

      La clase SampleMetaDataAndInvalidationGeneratorImpl es una clase personalizada Java que implementa la interfaz com.websphere.cache.webservices.MetaDataGenerator y la interfaz com.websphere.cache.webservices.InvalidationGenerator. La clase SampleMetaDataAndInvalidationGeneratorImpl contiene el método setMetaData y el método getInvalidationIds. También puede configurar dos clases más pequeñas en lugar de esta clase grande. Por ejemplo, cree una clase para el generador de metadatos y una clase distinta para el generador de invalidación. Los siguientes son prototipos de métodos para el método setMetaData y el método 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)

      A continuación se muestra un ejemplo de clase SampleMetaDataAndInvalidationGeneratorImpl.java:

      public class SampleMetaDataAndInvalidationGeneratorImpl implements 
        MetaDataGenerator, InvalidationGenerator {
          //asignar el límite de tiempo y los metadatos de prioridad
          public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, 
        com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
      			....
                      
      		// recuperar entradas de cabecera SOAP a partir de 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”)) {
      					// recuperar cada elemento de metadatos y establecer metadatos 
      	                entryInfo.setTimeLimit(timeLimit);
                      entryInfo.setPriority(priority);
                  }
              }
          }
      
          //crea ID de invalidación mediante la cabecera de SOAP. 
          public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext 
            messageContext) {			....
      			// recuperar entradas de cabecera SOAP a partir de 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();
      					}
      					...
      					...
      					// crear un método "parseAndSort" para analizar y clasificar cotizaciones
      					// Al analizar y clasificar cotizaciones, evita que en la memoria caché se dupliquen 
      					// las entradas.
      					// cotizaciones, por ejemplo SUNW,NT
      					// para devolver una clave de memoria caché "urn:stock:symbol=NT,SUNW"
      					String sortQuotes = parseAndSort(quotes); 
      					invalidationIds[0] = headerEntryName + "=" sortQuotes;
                   }
      	   	}
      		return invalidationIds;
          }
      }
      
      El ID de invalidación para este ejemplo se genera como:
      http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW

      A continuación aparece un ejemplo de la solicitud SOAP generada por el cliente al utilizar el código Java personalizado:

      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. Guarde la política de memoria caché para el directorio adecuado.
    • Si está utilizando la pasarela de servicios web en el canal SOAP 1, el directorio es: <raíz_servidor_apl>\installedApps\wsgwsoap1.nombre_servidor.nombre_nodo.ear/wsgwsoap.war/WEB-INF
    • Si utiliza un cliente JAX-RPC sencillo de la aplicación para invocar servicios web remotos, guarde la política de memoria caché en el módulo web WEB-INF de la aplicación JAX-RPC.

Resultados

Puede supervisar los resultados de la política de memoria caché de cliente de servicios web mediante la utilización del supervisor de memoria caché dinámica. Para obtener más información, consulte el apartado Cómo mostrar la información de la memoria caché.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdyn_wsclientcache
File name: tdyn_wsclientcache.html