Exemplo: Armazenando em Cache Serviços da Web.
É possível construir um conjunto de políticas de cache e mensagens SOAP para um aplicativo de serviços da web.
A seguir há um exemplo de construção de um conjunto de políticas de cache para um aplicativo de serviços da Web simples. O aplicativo neste exemplo armazena cotações de ações e tem operações para ler, atualizar o preço e comprar um determinado símbolo de ação.
A seguir estão dois exemplos de mensagens SOAP que o aplicativo pode receber, com os cabeçalhos de Pedido HTTP acompanhantes.
A primeira amostra de mensagem contém uma mensagem SOAP para uma operação GetQuote, solicitando uma cotação à IBM®. Esta é uma operação de leitura que obtém seus dados do backend e é uma boa candidata para armazenamento em cache. Neste exemplo, a mensagem SOAP é armazenada em cache e um tempo limite é colocado em suas entradas para garantir que as cotas que ela retorna sejam atuais.
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>O cabeçalho HTTP SOAPAction no pedido é definido na especificação de SOAP e é utilizado por servidores proxy HTTP para despachar pedidos para determinados servidores HTTP. O cache dinâmico do WebSphere Application Server pode utilizar esse cabeçalho em suas políticas de cache para criar IDs sem ter de analisar a mensagem SOAP.
O exemplo de mensagem 2 ilustra uma mensagem SOAP para uma operação BuyQuote. Embora a mensagem 1 seja armazenável em cache, esta mensagem não é, porque ela atualiza o banco de dados de backend.
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>
O gráfico a seguir ilustra como chamar métodos com as mensagens SOAP. Em termos de serviços da Web, especialmente o Web Services Description Language (WSDL), um serviço é uma coleção de operações, como getQuote e buyStock. Um espaço de nomes de elementos de corpo (urn:stockquote no exemplo) define um serviço, e o nome do primeiro elemento do corpo indica a operação.

O exemplo a seguir mostra WSDL para a operação 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 um conjunto de políticas de cache para aplicativo de serviços da Web, configure o cache dinâmico do WebSphere Application Server para reconhecer a operação de serviço armazenável em cache da operação.
O WebSphere Application Server examina o pedido HTTP para determinar se uma mensagem que chega pode ou não ser armazenada em cache, com base nas políticas de cache definidas para um aplicativo. Neste exemplo, buyStock e stock-update não são armazenados no cache, mas stockquote-lookup é armazenado no cache. No arquivo cachespec.xml para esse aplicativo da Web, as políticas de cache precisam de definição desses serviços para que o cache dinâmico possa manipular ambos SOAPAction e a operação de serviço.
O WebSphere Application Server usa a operação e o corpo da mensagem nos IDs de cache de serviços da Web, cada qual possuindo um componente associado a eles. Portanto, cada regra <cache-id> de serviços da Web contém apenas dois componentes. O primeiro é para a operação. Como é possível executar a operação stockquote-lookup utilizando um cabeçalho SOAPAction ou uma operação de serviço no corpo, é preciso definir dois elementos <cache-id> diferentes, um para cada método. O segundo componente é do tipo "corpo" e define como o WebSphere Application Server deve incorporar o corpo da mensagem no ID de cache. É possível utilizar um sinal numérico do corpo, embora seja válido utilizar a mensagem de entrada literal no ID.
O pedido HTTP de entrada é analisado pelo WebSphere Application Server para determinar quais regras <cache-id> correspondem. Em seguida, as regras são aplicadas para formar IDs de cache ou de invalidação.
O código de amostra a seguir é de um arquivo cachespec.xml que define regras de SOAPAction e de 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>