Utilisez le code Java personnalisé pour créer l'ID de cache à partir du contenu du message SOAP
en entréeSi vous utilisez le code Java personnalisée pour créer l'ID de cache, créez
une classe Java pour le générateur d'ID qui implémente l'interface IdGenerator
définie dans le package com.ibm.websphere.cache.webservices.IdGenerator et ajoutez une référence
à la classe que vous créez dans le fichier cachespec.xml en utilisant la balise
idgenerator.
Vous pouvez également implémenter le package com.ibm.websphere.cache.webservices.MetaDataGenerator
de façon à affecter les métadonnées de cache, telles que le délai d'attente, la priorité et les ID de dépendance,
aux entrées de cache à l'aide de la balise metadatagenerator.
Implémentez l'interface
com.ibm.websphere.cache.webservices.InvalidationGenerator et utilisez la balise
invalidationgenerator dans le fichier cachespec.xml pour générer des ID de cache et invalider des entrées du cache. L'ID généré par le générateur d'invalidation peut être un ID de cache ou un ID de dépendance.
Par exemple, si vous développez une classe de générateur d'ID nommée SampleIdGeneratorImpl, une classe de générateur de métadonnées nommée SampleMetaDataGeneratorImpl, et une classe de générateur d'invalidation nommée SampleInvalidationGeneratorImpl, votre fichier cachespec.xml contiendra ce qui suit :
<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 classe SampleIdGeneratorImpl est une classe Java personnalisée
qui implémente l'interface
com.websphere.cache.webservices.IdGenerator . La classe SampleIdGeneratorImpl contient la méthode getID :
String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)
Voici l'exemple de la classe SampleIdGeneratorImpl.java.
public class SampleIdGeneratorImpl implements IdGenerator {
//The SampleIdGenerator class builds cache keys using SOAP header entries
public String getId(javax.xml.rpc.handler.soap.SOAPMessageContext
messageContext) {
....
// retrieve SOAP header entries from 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();
}
...
...
// create a method "parseAndSort" to parse and sort quotes
// By parsing and sorting quotes, you avoid duplicate cache
// entries.
// quotes e.g. IBM,CSCO,MSFT,INTC
// to return a cache key "urn:stock:getQuote=CSCO,IBM,INTC,MSFT"
String sortQuotes = parseAndSort(quotes);
cacheKey = headerEntryName + "=" + sortQuotes;
}
}
return cacheKey;
}
}
L'ID de cache de cet exemple est généré en tant que http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.
La classe SampleMetaDataAndInvalidationGeneratorImpl est une classe Java personnalisée
qui implémente l'interface com.websphere.cache.webservices.MetaDataGenerator
et l'interface com.websphere.cache.webservices.InvalidationGenerator. La classe SampleMetaDataAndInvalidationGeneratorImpl contient la méthode setMetaData
et la méthode getInvalidationIds. Vous pouvez également configurer deux classes de taille inférieure au lieu de cette classe de grande taille.
Par exemple, créez une classe pour le générateur de métadonnées
et une classe différente pour le générateur d'invalidation. Voici les prototypes des méthodes setMetaData et 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)
Voici un exemple de classe SampleMetaDataAndInvalidationGeneratorImpl.java :
public class SampleMetaDataAndInvalidationGeneratorImpl implements
MetaDataGenerator, InvalidationGenerator {
//assigns time limit, and priority metadata
public void setMetadata(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext,
com.ibm.websphere.cache.webservices.JAXRPCEntryInfo entryInfo) {
....
// retrieve SOAP header entries from 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”)) {
// retrieve each metadata element and set metadata
entryInfo.setTimeLimit(timeLimit);
entryInfo.setPriority(priority);
}
}
}
//builds invalidation ids using SOAP header.
public String[] getInvalidationIds(javax.xml.rpc.handler.soap.SOAPMessageContext
messageContext) { ....
// retrieve SOAP header entries from 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();
}
...
...
// create a method "parseAndSort" to parse and sort quotes
// By parsing and sorting quotes, you avoid duplicate cache
// entries.
// quotes e.g. SUNW,NT
// to return a cache key "urn:stock:symbol=NT,SUNW"
String sortQuotes = parseAndSort(quotes);
invalidationIds[0] = headerEntryName + "=" sortQuotes;
}
}
return invalidationIds;
}
}
L'ID d'invalidation de cet exemple est généré en tant que :
http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW
Exemple de demande SOAP généré par le client à l'aide du code Java personnalisé :
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>