[SOA] OSB Web Service Response Caching by Service Operation

原文はこちら。
https://blogs.oracle.com/bwb/entry/osb_web_service_response_caching

Oracle Service BusにはOracle Coherenceを使ったBusiness ServiceのResult Cache機能が組み込まれています。 しかし、Business Serviceが複数のオペレーションをサポートしている場合や、キャッシュのキーとして保存可能な、全てのオペレーションに共通するパラメータがない場合はどうなのでしょうか。
幸運にも、まさにこうしたシナリオに対するソリューションがあります。このエントリでは、サービスの各オペレーションで異なるキャッシュキー式を指定する方法をご紹介します。

OSB Web Service Response Caching by Service Operation
Oracle Service BusにはOracle Coherenceを使ったBusiness ServiceのResult Cache機能が組み込まれています。 詳細は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Administrator's Guide for Oracle Service Bus 11g Release 1 (11.1.1.6.2)
Improving Performance by Caching Business Service Results
http://docs.oracle.com/cd/E23943_01/admin.1111/e15867/configuringandusingservices.htm#CHDDCGEE
Oracle® Fusion Middleware Oracle Service Bus管理者ガイド 11g リリース1 (11.1.1.6.0)
ビジネス・サービスの結果のキャッシュによるパフォーマンスの改善
http://docs.oracle.com/cd/E28389_01/admin.1111/b61436/configuringandusingservices.htm#CHDDCGEE
Business Service毎に、リクエスト/レスポンスを識別するために使う一意のキーとしてキャッシュトークンを定義します。

キャッシュトークンは、XPath式から導出された文字列値です。このキャッシュトークン式は、以下のようにビジネスサービスの[詳細設定]で定義することができます。

しかし、ビジネスサービスが複数のオペレーションをサポートされている場合や、キャッシュのキーとして使用できるすべての操作に共通するパラメータがない場合はどうでしょう?

どうすれば、各オペレーションに固有のキャッシュキー式を設定することができるのでしょうか?
幸いにも、まさにこのシナリオのためのソリューションがあります。以下のリンクで説明されているように、キャッシュトークンは実行時に設定できます。
Oracle® Fusion Middleware Administrator's Guide for Oracle Service Bus 11g Release 1 (11.1.1.6.2)
Message Handling Configuration Page
http://docs.oracle.com/cd/E23943_01/admin.1111/e15867/business_services.htm#i1141909
Oracle® Fusion Middleware Oracle Service Bus管理者ガイド 11g リリース1 (11.1.1.6.0)
「メッセージ処理構成」ページ
http://docs.oracle.com/cd/E28389_01/admin.1111/b61436/business_services.htm#i1141909
キャッシュトークンの値をProxy Serviceのパイプラインの$outbound/ctx:transport/ctx:request/ctx-cache-token 要素に設定することができます。

キャッシュトークンの値を実行時に設定する

では、3個のオペレーションを持つDepartment FinderというWebサービスについて考えます(このWebサービスは以前のエントリで紹介した手順に従って作成できます)。
以前のエントリとは…Create a simple Web Service from Java Code using JDeveloper
https://blogs.oracle.com/bwb/resource/webservices/Create_a_simple_Web_Service_from_Java_Code_using_JDeveloper.html
Webサービスとして公開されるJavaのメソッドは以下のようなものです。
public DepartmentDetails getDepartmentDetails(String deptNumber) throws DepartmentFinderFault
public DepartmentDetails getDepartmentByMgrEmailId(String mgrEmailId) throws DepartmentFinderFault
public List<String>  getDepartments()
3個のメソッドにはキャッシュキーとして利用できる共通のパラメータはありません。
では、ブランチノードを持つDepartmentFinderProxyから取りかかりましょう。

ブランチノードの各ブランチには、対応するオペレーションを呼び出す1つのルートアクションが含まれています。

上図でgetDepartmentDetailsリンクを選択すると、OSBはgetDepartmentDetailsブランチを表示します。

ブランチにはRouteNode2というルートノードが含まれています。

ルートノードでは、リクエストアクションを追加してキャッシュのキーとして利用するパラメータを取得し、リクエストメッセージ中に設定します。上のRouteNode2アイコンをクリックすると、OSBはルートノードの設定画面を表示します(下図)。

新しくリクエストメッセージのインサートアクションを追加し、<tp:cache-token>要素を$inboundコンテキスト変数のリクエストの箇所に追加します。既存の<tp:headers>要素の後ろに<tp:cache-token>要素を追加するように設定します。
トークン要素の値を正しいパラメータをリクエストメッセージから取り出すXPath式で定義します。
実行時に、XPath式はクライアントから送られたdeptNumberの値を取得し、この値をキャッシュ目的でキャッシュトークンの一意の値として利用します。

この手順を各ブランチ毎に繰り返し実施します。例えば、次のブランチはgetDepartmentByMgrEmailIdブランチです。

ここにはRouteNode3というルートノードが含まれています。

The Insert action in the getDepartmentByMgrEmailIdルートノードのインサートアクションはgetDepartmentDetailsルートアクションとほぼ同じです。
mgrEmailIdをリクエストメッセージから取得するようにXPath式を修正し、この値をキャッシュトークンの値として利用します。

3個目のオペレーションであるgetDepartmentsにはパラメータがないので、同じキャッシュトークンの値に全ての結果をキャッシュすることができます。
他のオペレーションのキャッシュキーと衝突しない限り、キャッシュトークン式は任意の値に解決することができます。例えば、string型(AllDepartments)のキャッシュトークン式が'AllDepartments'という文字列リテラル値に解決します。

    string(AllDepartments)


各ブランチオペレーションのルートノードを構成したら、テストしましょう。

トレースの例
実行時のトレースの例です。
クライアントはgetDepartmentDetailsオペレーションを2という部門IDで呼び出しています。リクエスト・レスポンスは以下の通りです。

トレースから、リクエストメッセージに<tran:cache-token>要素に2という値が入っていることがわかります。これはクライアントから送信された部門IDです。
この値はサービス名とオペレーション名(このエントリのはじめに最初の図にあったもの)に紐づけられ、リクエストメッセージの一意のキーとなり、レスポンスをキャッシュします。

最終的に、トレースの最後で$outboundコンテキスト値が更新されて部門2の詳細に対するリクエストが完了しますが、これはキャッシュからのレスポンスではありません。

次のテストでの部門2の詳細の問い合わせでは、キャッシュが完了させています(下図)

この例ではBusiness Serviceのキャッシュトークンを実行時に設定することをご説明しました。このやり方で様々なXPath式を使ってサービスの各オペレーション用にキャッシュキーの値として生成することができます。

このエントリのサンプルは以下の環境でテストしました。
  • Oracle Service Bus Version: [Oracle Service Bus 11.1 Wed Apr 20 04:25:20 EDT 2011 1400736]
  • Oracle Weblogic Server Version: [WebLogic Server 10.3.5.0 Fri Apr 1 20:20:06 PDT 2011 1398638 ]

0 件のコメント:

コメントを投稿