Mit angepasstem Java-Code
die Cache-ID aus dem Inhalt der SOAP-Nachricht erstellenWenn
Sie eigenen Java-Code verwenden,
um die Cache-ID zu erstellen, müssen Sie eine Java-Klasse
als ID-Generator verwenden, die die im Paket com.ibm.websphere.cache.webservices.IdGenerator definierte
Schnittstelle "IdGenerator" implementiert, und der Datei "cachespec.xml" mit dem Tag idgenerator eine Referenz
auf die erstellte Klasse hinzufügen.
Sie können auch das Paket
"com.ibm.websphere.cache.webservices.MetaDataGenerator"
implementieren, um den Cacheeinträgen mit dem Tag metadatagenerator
Cachemetadaten wie Zeitlimit, Priorität und Abhängigkeits-IDs zuzuordnen.
Implementieren Sie die Schnittstelle
"com.ibm.websphere.cache.webservices.InvalidationGenerator" und verwenden Sie das Tag
invalidationgenerator in der Datei cachespec.xml, um Cache-IDs zu generieren und Einträge im Cache ungültig
zu machen.
Die vom Invalidierungsgenerator generierte ID kann eine Cache-ID oder eine Abhängigkeits-ID sein.
Wenn Sie beispielsweise
eine ID-Generatorklasse mit dem Namen SampleIdGeneratorImpl, eine Generatorklasse für Metadaten mit
dem Namen "SampleMetaDataGeneratorImpl" und eine Generatorklasse für Invalidierungen mit dem Namen
"SampleInvalidationGeneratorImpl" erstellen, kann Ihre Datei "cachespec.xml" folgenden Inhalt haben:
<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>
Die Klasse "SampleIdGeneratorImpl" ist eine angepasste
Java-Klasse, die
die Schnittstelle
com.websphere.cache.webservices.IdGenerator implementiert.
Die Klasse "SampleIdGeneratorImpl" enthält die Methode "getID":
String getId(javax.xml.rpc.handler.soap.SOAPMessageContext messageContext)
Im Folgenden sehen Sie ein Beispiel für die Klasse "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;
}
}
Die generierte Cache-ID für dieses Beispiel ist
http://TradeSample.com:9080/service/getquote:urn:stock:symbol=CSCO,IBM,INTC,MSFT.
Die Klasse
SampleMetaDataAndInvalidationGeneratorImpl ist eine angepasste
Java-Klasse, die die Schnittstellen
com.websphere.cache.webservices.MetaDataGenerator und
com.websphere.cache.webservices.InvalidationGenerator.
Die Klasse SampleMetaDataAndInvalidationGeneratorImpl enthält die Methoden setMetaData
und getInvalidationIds. Sie können anstelle einer großen Klasse auch zwei kleinere Klassen konfigurieren.
Beispielsweise können Sie eine Klasse für den
Metadatengenerator und eine andere Klasse für den Invalidationsgenerator erstellen.
Im Folgenden sehen Sie Prototypen für die Methode setMetaData und die Methode 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)
Es folgt
ein Beispiel für die Klasse 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;
}
}
Die für dieses Beispiel generierte Invalidierungs-ID ist
http://TradeSample.com:9080/service/getquote:urn:stock:symbol=NT,SUNW
Es
folgt ein Beispiel für die SOAP-Anforderung, die vom Client generiert wird, wenn angepasster
Java-Code verwendet wird:
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>