Ejemplo: memoria caché para servicios web
Puede crear un conjunto de políticas de memoria caché y mensajes SOAP para una aplicación de servicios web.
El siguiente es un ejemplo de cómo crear un conjunto de políticas de memoria caché para una sencilla aplicación de servicios web. La aplicación de este ejemplo almacena las cotizaciones bursátiles y tiene operaciones para leer, actualizar el precio de y comprar un símbolo bursátil determinado.
Los siguientes son ejemplos de mensajes SOAP que la aplicación puede recibir, con las cabeceras de solicitud HTTP que le acompañan.
El primer ejemplo de mensaje contiene un mensaje SOAP para una operación GetQuote que solicita una cotización para IBM®. Esta es una operación de sólo lectura que obtiene sus datos de la aplicación subordinada y tiene muchas posibilidades de colocarse en memoria caché. En este ejemplo el mensaje SOAP se almacena en la memoria caché y se coloca un tiempo de espera en sus entradas para garantizar que las respuestas sean actuales.
POST /soap/servlet/soaprouter HTTP/1.1 Host: www.myhost.com Content-Type: text/xml; charset="utf-8" SOAPAction: urn:stockquote-lookup <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:getQuote xmlns:m="urn:stockquote"> <symbol>IBM</symbol> </m:getQuote> </SOAP-ENV:Body> </SOAP-ENV:Envelope>La cabecera HTTP SOAPAction de la solicitud se define en la especificación SOAP y la utilizan los servidores proxy HTTP para asignar las solicitudes a los servidores HTTP determinados. La memoria caché dinámica de WebSphere Application Server puede utilizar esta cabecera en sus políticas de memoria caché para crear los ID sin tener que analizar el mensaje SOAP.
El ejemplo de mensaje número 2 ilustra un mensaje SOAP para una operación BuyQuote. Aunque el mensaje 1 se puede almacenar en la memoria caché, este mensaje no se puede, porque actualiza la base de datos subordinada.
POST /soap/servlet/soaprouter HTTP/1.1 Host: www.myhost.com Content-Type: text/xml; charset="utf-8" SOAPAction: urn:stockquote-update <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:buyStock xmlns:m="urn:stockquote"> <symbol>IBM</symbol> </m:buyStock> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
El gráfico siguiente ilustra cómo se invocan los métodos con los mensajes SOAP. En términos de servicios web, sobre todo en WSDL (Web Services Description Language), un servicio es un grupo de operaciones como, por ejemplo, getQuote y buyStock. Un espacio de nombres del elemento de texto (en el ejemplo, urn:stockquote) define un servicio y el nombre del primer elemento de texto indica la operación.

El siguiente es un ejemplo de WSDL para la operación getQuote:
<?xml version="1.0"?>
<definitions name="StockQuoteService-interface"targetNamespace="http://www.getquote.com/StockQuoteService-interface"xmlns:tns="http://www.getquote.com/StockQuoteService-interface"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns=soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns="http://schemas.xmlsoap.org/wsdl/"<message name="SymbolRequest">
<part name="return" type="xsd:string"/>
</message>
<portType name="StockQuoteService">
<operation name="getQuote">
<input message="tns:SymbolRequest"/>
<output message="tns:QuoteResponse"/>
</operation>
</portType>
<binding name="StockQuoteServiceBinding"type="tns:StockQuoteService">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getQuote">
<soap:operation soapAction="urn:stockquote-lookup"/>
<input>
<soap:body use="encoded" namespace="urn:stockquote"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
namespace="urn:stockquotes"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
</definition>
Para construir un conjunto de políticas de memoria caché para una aplicación de servicios web, debe configurar la memoria caché dinámica de WebSphere Application Server para que reconozca la operación del servicio que se puede colocar en memoria caché de la operación.
WebSphere Application Server analizará la solicitud HTTP para determinar si se puede almacenar o no en la memoria caché un mensaje de entrada basándose en las políticas de memoria caché definidas para una aplicación. En este ejemplo, buyStock y stock-update no se almacenan en la memoria caché, pero sí se almacenará stockquote-lookup. En el archivo cachespec.xml de esta aplicación web, se deben definir las políticas de memoria caché para estos servicios, de modo que la memoria caché dinámica pueda manejar la operación SOAPAction y la operación de servicio.
WebSphere Application Server utiliza la operación y el cuerpo del mensaje en los ID de memoria caché de los servicios web, cada uno de los cuales tiene un componente asociado. Por lo tanto, cada regla <cache-id> de servicios web contendrá solamente dos componentes. El primer componente es para la operación. Debido a que la operación stockquote-lookup puede realizarse mediante el uso de una cabecera SOAPAction o una operación de servicio en el texto, hay que definir dos elementos <cache-id> diferentes, uno para cada método. El segundo componente es de tipo texto ("body") y define cómo debe incorporar WebSphere Application Server el texto del mensaje en el ID de memoria caché. Se puede utilizar un total de control del texto, aunque se permite utilizar el mensaje de entrada literal en el ID.
WebSphere Application Server analiza la solicitud HTTP de entrada para determinar cuál de las reglas <cache-id> coinciden. A continuación, se aplican las reglas para crear los ID de memoria caché o de invalidación.
El siguiente es un código de ejemplo de un archivo cachespec.xml que define las normas SOAPAction y servicesOperation:
<cache>
<cache-entry>
<class>webservice</class>
<name>/soap/servlet/soaprouter</name>
<sharing-policy>not-shared</sharing-policy>
<cache-id>
<component id="" type="SOAPAction">
<value>urn:stockquote-lookup</value>
</component>
<component id="Hash" type="SOAPEnvelope"/>
<timeout>3600</timeout>
<priority>1<priority>
</component>
</cache-id>
<cache-id>
<component id="" type="serviceOperation">
<value>urn:stockquote:getQuote</value>
</component>
<component id="Hash" type="SOAPEnvelope"/>
<timeout>3600</timeout>
<priority>1</priority>
</component>
</cache-id>
</cache-entry>
</cache>