例: Web サービスのキャッシュ
Web サービス・アプリケーション用のキャッシュ・ポリシーの集合と SOAP メッセージを作成できます。
以下に示すのは、簡単な Web サービス・アプリケーション用にキャッシュ・ポリシーの集合を作成する例です。この例におけるアプリケーションは、 株価情報を保管し、指定された株式銘柄の価格を読み取って更新したり、 その銘柄の株式を買ったりするオペレーションを行います。
以下に示すのは、付随する HTTP 要求ヘッダーを使用してアプリケーションが受信できる 2 つの SOAP メッセージ例です。
最初のメッセージ・サンプルには、GetQuote オペレーションの SOAP メッセージが 収められており、IBM® の株価を要求しています。 これは、データをバックエンドから取得する読み取り専用オペレーシ ョンであり、キャッシュの良い候補です。 この例では、SOAP メッセージがキャッシュに入れられ、タイムアウトがエントリーに配置されて、 それによって戻される株価が現行のものであるようにしています。
POST /soap/servlet/soaprouter HTTP/1.1 Host: www.myhost.com Content-Type: text/xml; charset="utf-8" SOAPAction: urn:stockquote-lookup <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:getQuote xmlns:m="urn:stockquote"> <symbol>IBM</symbol> </m:getQuote> </SOAP-ENV:Body> </SOAP-ENV:Envelope>要求の中の SOAPAction HTTP ヘッダーは、SOAP 仕様で定義され、 HTTP プロキシー・サーバーによって使用されて、要求を特定の HTTP サーバーにディスパッチします。 WebSphere® Application Server の動的キャッシュは、 このヘッダーをキャッシュ・ポリシーの中で使用して、SOAP メッセージの構文解析を行うこと なく ID を作成できます。
メッセージ例 2 は、BuyQuote オペレーションの SOAP メッセージを説明しています。 メッセージ 1 がキャッシュ可能なのに対して、このメッセージは、バックエンド・データベースを更新するので、 キャッシュ可能ではありません。
POST /soap/servlet/soaprouter HTTP/1.1 Host: www.myhost.com Content-Type: text/xml; charset="utf-8" SOAPAction: urn:stockquote-update <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:buyStock xmlns:m="urn:stockquote"> <symbol>IBM</symbol> </m:buyStock> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
次の図は、SOAP メッセージを使用してメソッドを呼び出す方法を示しています。 Web サービスの用語、特に Web サービス記述言語 (WSDL) では、サービスとは、getQuote や buyStock などのオペレーションの集合のことです。本文エレメントの名前空間 (例では urn:stockquote) はサービスを定義し、最初の本文エレメントの名前はオペレーションを示しています。

以下に示すのは、getQuote オペレーションの WSDL の例です。
<?xml version="1.0"?>
<definitions name="StockQuoteService-interface"targetNamespace="http://www.getquote.com/StockQuoteService-interface"xmlns:tns="http://www.getquote.com/StockQuoteService-interface"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns=soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns="http://schemas.xmlsoap.org/wsdl/"<message name="SymbolRequest">
<part name="return" type="xsd:string"/>
</message>
<portType name="StockQuoteService">
<operation name="getQuote">
<input message="tns:SymbolRequest"/>
<output message="tns:QuoteResponse"/>
</operation>
</portType>
<binding name="StockQuoteServiceBinding"type="tns:StockQuoteService">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getQuote">
<soap:operation soapAction="urn:stockquote-lookup"/>
<input>
<soap:body use="encoded" namespace="urn:stockquote"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:stockquotes"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
</definition>
Web サービス・アプリケーション用にキャッシュ・ポリシーのセットを作成するには、オペレーション内のキャッシュ可能サービス・オペレーションを認識する WebSphere Application Server 動的キャッシュを構成します。
WebSphere Application Server は、HTTP 要求を検査して、アプリケーション用に定義されたキャッシュ・ポリシーに 基づいて着信メッセージをキャッシュできるかどうかを判別します。この例では、buyStock および stock-update はキャッシュされず、stockquote-lookup がキャッシュされます。 この Web アプリケーションの cachespec.xml ファイルでは、動的キャッシュが SOAPAction とサービス・オペレーションを両方とも処理できるように、キャッシュ・ポリシーはこれらのサービスに対する定義を必要とします。
WebSphere Application Server は、オペレーションおよびメッセージ本文を Web サービス・キャッシュ ID の中で使用します。これらのキャッシュ ID はそれぞれ、オペレーションおよびメッセージ本文と関連付けられたコンポーネントを持っています。したがって、個々の Web サービス <cache-id> ルールには、コンポーネントが 2 つだけ含まれています。最初のコンポーネントはオペレーション用です。 ユーザーは、SOAPAction ヘッダーまたはサービス・オペレーションを本文の中で使用することによって stockquote-lookup オペレーションを実行できるため、 2 つの異なる <cache-id> エレメント (それぞれの方法に 1 つずつ) を定義する必要があります。 2 番目のコンポーネントは、「本文」タイプであり、 どのように WebSphere Application Server がメッセージ本文をキャッシュ ID に取り込むかを定義します。 本文のハッシュを使用することができますが、リテラル着信メッセージを ID の中で使用してもかまいません。
着信 HTTP 要求は、どちらの <cache-id> ルールが適合するかを判別 するために、WebSphere Application Server によって解析されます。 次に、キャッシュまたは無効化 ID を作成するためにこれらのルールが適用されます。
以下に示すのは、 SOAPAction および servicesOperation ルールを定義する cachespec.xml ファイルのサンプル・コードです。
<cache>
<cache-entry>
<class>webservice</class>
<name>/soap/servlet/soaprouter</name>
<sharing-policy>not-shared</sharing-policy>
<cache-id>
<component id="" type="SOAPAction">
<value>urn:stockquote-lookup</value>
</component>
<component id="Hash" type="SOAPEnvelope"/>
<timeout>3600</timeout>
<priority>1<priority>
</component>
</cache-id>
<cache-id>
<component id="" type="serviceOperation">
<value>urn:stockquote:getQuote</value>
</component>
<component id="Hash" type="SOAPEnvelope"/>
<timeout>3600</timeout>
<priority>1</priority>
</component>
</cache-id>
</cache-entry>
</cache>