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