Configurando o Cache do Cliente de Serviços da Web JAX-RPC

O cache de cliente de serviços da web é fornecido como um manipulador da "Java™ API for XML-Based Remote Procedure Calls (JAX-RPC) " no servidor de aplicativos. O cache do cliente de serviços da Web JAX-RPC faz parte do serviço de cache dinâmico usado para aumentar o desempenho dos clientes de serviços da Web ao armazenar em cache as respostas a partir de serviços da Web remotos. Configurar o cache de cliente de serviços da Web JAX-RPC pode melhorar o desempenho do seu servidor de aplicativos ao armazenar em cache as respostas de serviços da Web remotos durante um tempo determinado.

Antes de Iniciar

O serviço de cache dinâmico é ativado por padrão. É possível configurar a instância de cache padrão no console administrativo. Consulte Usando o Serviço de Cache Dinâmico para obter informações adicionais. Antes de tentar configurar o cache do cliente de serviços da Web, entenda como criar políticas de cache básicas. Consulte Configurando objetos armazenáveis no cache com o arquivo cachespec.xml para obter informações adicionais.

Sobre Esta Tarefa

Ativar o cache do cliente de serviços da Web é uma opção para melhorar o desempenho do seu sistema usando o serviço de cache dinâmico para salvar as respostas dos serviços remotos da Web por um período de tempo específico. Com oWebSphere Application Server Versão 6.1, o armazenamento em cache de serviços da Web é ativado apenas quando ativar o serviço de cache dinâmico. Você ativa o armazenamento em cache de serviço da Web ao ativar o serviço de cache dinâmico e o armazenamento em cache de servlet. Depois que uma resposta é retornada a partir do serviço da Web remoto, a resposta é salva no cache do cliente no servidor de aplicativos. Quaisquer solicitações idênticas que são feitas para o mesmo serviço da Web remoto são então respondidas para e a partir do cache durante um tempo especificado. O cache de cliente de serviços da Web depende principalmente das invalidações baseadas em tempo porque o serviço da Web de destino pode estar fora da sua rede corporativa e não reconhecer seu armazenamento em cache do cliente. Portanto, é possível especificar o tempo no cache e as regras para construir IDs de entrada de cache no cache do aplicativo cliente.

O cache de cliente de serviços da Web é fornecido como um manipulador da "Java API for XML-Based Remote Procedure Calls (JAX-RPC)" no seu servidor de aplicativos. Esta rotina de tratamento do cache JAX-RPC intercepta os pedidos SOAP que passam por ela a partir de aplicativos clientes. Em seguida, identifica uma política de cache baseada no serviço da Web de destino. Após a localização de uma política, todas as regras de ID do cache são avaliadas uma por uma até uma regra válida ser detectada.

Procedimento

  1. Localize o arquivo WSDL (Web Services Description Language) para o serviço remoto. As partes do arquivo WSDL contêm informações que você utilizará ao gravar a política de cache. Para obter informações adicionais sobre os arquivos WSDL, consulte WSDL. A seguir está um exemplo de partes de um arquivo WSDL que contêm valores que são utilizados para fins de demonstração.
    <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>
    O texto destacado indica valores que são utilizados na gravação de sua política de cache.
  2. Escolha como planeja gerar o ID de cache para seu armazenamento em cache de cliente de serviços da Web. É possível construir suas regras de ID de cache utilizando uma das quatro opções:
    • Calculando um hash de SOAPEnvelope
    • Utilizando entradas SOAPHeader
    • Utilizando os parâmetros de operação e de parte
    • Utilizando o código Java customizado para criar o ID de cache do conteúdo da mensagem SOAP de entrada
    Utilizar entradas SOAPHeader é a melhor opção se você puder incluir as informações para construir chaves de cache como parte do cabeçalho SOAP. Este método cria chaves de cache de fácil leitura e pode ser construído sem analisar o corpo SOAP. Use o código Java customizado para gerar um id de cache específico com base na mensagem SOAP. Se você não puder incluir as informações de cabeçalho, será possível calcular o hash do SOAPEnvelope para desempenho ou analisar o Corpo SOAP para chaves de cache amigas do usuário.
  3. Desenvolva sua política de cache.

    Todas as políticas de cache de cliente de serviços da Web devem ter o elemento class JAXRPCClient. O elemento name em cada entrada de cache é o local de nó de extremidade de destino que é definido no arquivo WSDL. É possível localizar este endereço no arquivo WSDL localizando a tag <soap:address location=".."/> localizada no elemento port. No arquivo WSDL desta amostra, o endereço é http://TradeSample.com:9080/service/getquote. Desenvolva o restante de sua política de cache utilizando uma das seguintes opções:

    • Calcule um hash do SOAPEnvelope para identificar o pedido
      <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>

      Observe os atributos component para criar um ID de cache com base em um cálculo hash do SOAPEnvelope. O ID de cache para esta amostra é gerado como http://TradeSample.com:9080/service/getquote:Hash=xxxHashSoapEnvelope.

    • Utilize SoapHeader para identificar o pedido
      <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 cache é construído utilizando informações especiais no cabeçalho SOAP para identificar os pedidos para as entradas no cache. Especifique o tipo como SOAPHeaderEntry e o id como o nome operation localizado no elemento binding no arquivo WSDL. O ID de cache para essa amostra é gerado como http://TradeSample.com:9080/service/getquote:urn:stock:getQuote=IBM.

      Um exemplo de um pedido SOAP gerado pelo cliente utilizando o Cabeçalho SOAP:

      Observe que o atributo soapenv:actor deve conter 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>
    • Utilize a operação e a parte para identificar o pedido
      <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 exemplo utiliza parâmetros de operação e de pedido. A operação pode ser um nome de método no arquivo WSDL localizado no elemento binding ou um nome de método no DII (Document/Literal Invocation). Se o espaço de nomes da operação for definido, o valor será formatado como namespaceOfOperation:nameOfOperation. O tipo part pode ser definido no elemento message do arquivo WSDL, como um parâmetro de pedido ou como um parâmetro de pedido da chamada DII. Seu atributo id é a parte ou o nome do parâmetro e value é a parte ou o valor do parâmetro. O ID de cache gerado a partir do uso da operação e dos parâmetros de pedido é http://TradeSample.com:9080/service/getquote:operation=http://TradeSample.com/:getQuote/symbol=IBM.

      Um exemplo do pedido SOAP gerado pelo cliente utilizando a operação e a parte:

      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>
    • Use o código Java customizado para criar o id de cache do conteúdo da mensagem SOAP de entrada

      Se você usar o códigoJava para criar o id de cache, crie uma classe Java de gerador de ID que implemente a interface IdGenerator definida no pacote com.ibm.websphere.cache.webservices.IdGenerator e inclua uma referência na classe que você cria no arquivo cachespec.xml usando a tag idgenerator.

      Você também pode implementar o pacote com.ibm.websphere.cache.webservices.MetaDataGenerator para designar metadados de cache, como tempo limite, prioridade e IDs de dependência, as entradas de cache utilizando a tag metadatagenerator.

      Implemente a interface com.ibm.websphere.cache.webservices.InvalidationGenerator e utilize a tag invalidationgenerator no arquivo cachespec.xml para gerar IDs de cache e invalidar entradas no cache. O ID gerado pelo gerador de invalidação pode ser um ID de cache ou um ID de dependência.

      Por exemplo, se você desenvolver uma classe do gerador de ID denominada SampleIdGeneratorImpl, uma classe do gerador de metadados denominada SampleMetaDataGeneratorImpl e uma classe do gerador de invalidação denominada SampleInvalidationGeneratorImpl, seu arquivo cachespec.xml pode conter o seguinte:

      <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>
      A classe SampleIdGeneratorImpl é uma classe Java customizada que implementa a interface com.websphere.cache.webservices.IdGenerator. A classe SampleIdGeneratorImpl contém o método getID:
      String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)

      A seguir está um exemplo da classe SampleIdGeneratorImpl.java.

      public class SampleIdGeneratorImpl implements IdGenerator {
      //A classe SampleIdGenerator constrói chaves de cache utilizando entradas de cabeçalho SOAP
          public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext 
      			messageContext) {
      			....
      			// recupere entradas do cabeçalho 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();
      						}
      						...
      						...
      						// crie um método "parseAndSort" para analisar e classificar as aspas
      						// Analisando e classificando as aspas, você evita entradas de cache 
      						// duplicadas.
      						// aspas, por exemplo, IBM,CSCO,MSFT,INTC
      						// para retornar uma chave de cache "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
      						String sortQuotes = parseAndSort(quotes); 
      						cacheKey = headerEntryName + "=" + sortQuotes;
      	   			}
      				}
      		return cacheKey;
      		}
      	}

      O ID de cache para esta amostra é gerado como http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.

      A classe SampleMetaDataAndInvalidationGeneratorImpl é uma classe Java customizada que implementa a interface com.websphere.cache.webservices.MetaDataGenerator e a interface com.websphere.cache.webservices.InvalidationGenerator. A classe SampleMetaDataAndInvalidationGeneratorImpl contém o método setMetaData e o método getInvalidationIds. Você também pode configurar duas classes menores em vez desta classe grande. Por exemplo, crie uma classe para o gerador de metadados e uma classe diferente para o gerador de invalidação. Seguem protótipos de métodos para o método setMetaData e o 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)

      Segue um exemplo da classe SampleMetaDataAndInvalidationGeneratorImpl.java:

      public class SampleMetaDataAndInvalidationGeneratorImpl implements 
        MetaDataGenerator, InvalidationGenerator {
          //designa limite de tempo e metadados de prioridade
          public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext, 
        com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
      			....
                      
      		// recupere entradas do cabeçalho 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 metadados e definir metadados 
      	                entryInfo.setTimeLimit(timeLimit);
                      entryInfo.setPriority(priority);
                  }
              }
          }
      
          //constrói IDs de invalidação utilizando o cabeçalho SOAP. 
          public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext 
            messageContext) {			....
      			// recupere entradas do cabeçalho 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();
      					}
      					...
      					...
      					// crie um método "parseAndSort" para analisar e classificar as aspas
      					// Analisando e classificando as aspas, você evita entradas de cache 
      					// duplicadas.
      					// cotações, ex.: SUNW,NT
      					// para retornar uma chave de cache "urn:stock:symbol=NT,SUNW"
      					String sortQuotes = parseAndSort(quotes); 
      					invalidationIds[0] = headerEntryName + "=" sortQuotes;
                   }
      	   	}
      		return invalidationIds;
          }
      }
      
      O ID de invalidação desta amostra é gerado como:
      http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW

      Um exemplo do pedido SOAP gerado pelo cliente ao usar o código Java customizado:

      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. Salve a política de cache no diretório apropriado.
    • Se você estiver utilizando o gateway de serviços da web no canal 1 do SOAP, o diretório será: <app_server_root>\installedApps\wsgwsoap1.servername.nodename.ear/wsgwsoap.war/WEB-INF
    • Se você estiver usando um cliente JAX-RPC simples no seu aplicativo para chamar os serviços da Web remotos, salve sua política de cache no módulo da Web WEB-INF do seu aplicativo JAX-RPC.

Resultados

É possível monitorar os resultados de sua política de cache de cliente de serviços da Web usando o monitor de cache dinâmico. Consulte Exibindo Informações do Cache para obter informações adicionais.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tdyn_wsclientcache
Nome do arquivo: tdyn_wsclientcache.html