Utilice el código Java personalizado para crear el ID de memoria caché a
partir del contenido del mensaje SOAP de entradaSi 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>