Comments
Description
Transcript
静的サービスGWにおけるユーザー定義例外のハンドリング方法
静的サービスGWにおけるユーザー定義例外のハンドリング方法 【概要】 サービス・ゲートウェイのうち、静的サービス・ゲートウェイにおいて、Web サービスのユーザー定義例外をハン ドリングするために必要な、メディエーション・フロー上の構成について説明します。 【対象製品】 WebSphere Enterprise Service Bus (WESB) V6.2 WebSphere Enterprise Service Bus (WESB) V7.0 【内容詳細】 1. 背景 動的サービス・ゲートウェイにおいて、ユーザー定義例外をハンドリングする場合、正常レスポンスのハンド リング同様、図 1 のようにコールアウト・フォールトから入力フォールトへの単純なワイヤリングだけで構成可能 であるのに対し、静的サービス・ゲートウェイでは、正常レスポンスのハンドリング同様の方法であるデータ・ハ ンドラー・プリミティブの単純な配置では機能しません。 図 1. 動的サービス・ゲートウェイにおけるレスポンス・フローの例 図 2. 静的サービス・ゲートウェイにおけるレスポンス・フローの例(機能せず) なお、図 2 において単純なデータ・ハンドラー・プリミティブの配置では、機能しない理由については、「静的 サービス GW におけるユーザー定義例外のハンドリング方法 (補足)」に記載しています。必要に応じて参照 下さい。(以降、補足資料と呼びます) 2. 構成方法 ここでは、二つの方法について説明します。一つ目はカスタム・メディエーション・プリミティブを使用する方法 です。この方法は構成要素が少なくて済む反面、SMO(Service Message Object)に関する Java によるコーディ ングのスキルを必要とします。この方法は、V6.2 および V7.0 において動作確認済みです。 二つ目 XSL 変換プリミティブを使用した例で、こちらは Java コードを書かずに実装可能です。こちらは V6.2 においてのみ動作確認済みです。 なお、カスタム・メディエーション・プリミティブや XSL 変換プリミティブなどの基本的な作成・操作の手順につ いては、必要に応じてインフォメーション・センター等をご参照下さい。 2.1 カスタム・メディエーション・プリミティブを用いた構成方法 準備として追加で必要となるものはありません。カスタム・メディエーション・プリミティブを構成するのみで す。 2.1.1 応答フローの構成 応答フローは、カスタム・メディエーション・プリミティブをワイヤリングします。 図 3. 静的サービス・ゲートウェイにおけるレスポンス・フローの例 Java コードの内容については、補足資料にて掲載してある、SOAP メッセージをハンドリングするためのも のです。カスタム・メディエーション・プリミティブに課せられた要件は、補足資料内の③のメッセージが②の 形式に変換されることになります。 Java インポート import import import import com.ibm.websphere.sibx.smobo.ServiceMessageObjectFactory; commonj.sdo.DataObject; com.ibm.websphere.bo.BOFactory; com.ibm.websphere.sca.ServiceManager; 詳細 DataObject responseMessage = (DataObject) smo.getBody(); String code = responseMessage.getString("CustomFault/code"); String message = responseMessage.getString("CustomFault/message"); String SOAPMessage = "<soapenv:Fault xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" + " <faultcode>soapenv:Server</faultcode>\n" + " <faultstring>" + message + "</faultstring>\n" + " <detail><CustomFault>\n" + " <code>" + code + "</code>\n" + " <message>" + message + "</message>\n" + " </CustomFault></detail>\n" + "</soapenv:Fault>"; System.out.println("SOAPMessage: \n" + SOAPMessage); ServiceMessageObjectFactory smoFactory = ServiceMessageObjectFactory.INSTANCE; DataObject gatewayMessage = smoFactory.createServiceMessageObjectBody("http://www.ibm.com/websphere/sibx/ServiceGateway", "gatewayMessage"); BOFactory boFactory = (BOFactory) ServiceManager.INSTANCE.locateService("com/ibm/websphere/bo/BOFactory"); DataObject textBody = boFactory.create("http://com.ibm.wbiserver.gateway/schema", "TextBody"); textBody.setString("value", SOAPMessage); gatewayMessage.setDataObject(0, textBody); smo.setBody(gatewayMessage); out.fire(smo); // propagate the service message object to the primitive that is wired to the 'out' terminal 2.2 XSL 変換プリミティブを用いた構成方法 準備として追加で必要となるものは、以下の二つです。 • インターフェース • ユーザー定義例外のラッパーBO 2.2.1 インターフェース定義 SOAP Fault の元となるインターフェースの定義について構成に当たってのポイントを列挙します。 • インターフェースの名称は任意の名称で良い • 名前空間を「http://schemas.xmlsoap.org/soap/envelope/」とする • 作成する操作(オペレーション)は、片方向で良い • 操作の名称(オペレーション名)は、「Fault」とする • 入力には、「faultcode」「faultstring」を string タイプとして、「detail」を後述のユーザー定義例外のラッパ ーBO となるように定義する 図 4. インターフェース定義 2.2.2 ユーザー定義例外のラッパーBO 定義 インターフェースの入力で「detail」として指定した BO の定義について構成に当たってのポイントを列挙し ます。 • BO の名称は任意の名称で良い • BO のフィールドは、取り込むユーザー定義例外の BO 名とする 図 5. ラッパーBO 定義 取り込むユーザー定義例外の BO は、Web サービス(プロバイダー)から提供されている WSDL をインポ ートした際に、自動的に生成されているものを使用します。ここでは、その BO が CustomFault という名称で あるため、図 5 の例となっています。 2.2.3 応答フローの構成 応答フローでは、XSL 変換プリミティブとデータ・ハンドラー・プリミティブをワイヤリングします。 図 6. 応答フローの構成 XSL 変換プリミティブの出力ターミナルのメッセージタイプを 2.1 で定義したインターフェースのメッセージと なるように構成します。(必ず「{http://schemas.xmlsoap.org/soap/envelope/}FaultRequestMsg」となるはず です) 図 7. XSL 変換プリミティブの出力ターミナル 次に、XSL 変換プリミティブ自身を構成します。ここでの構成については、必ずしも一意には定められず、 何通りかの案があると考えられます。(例:例外の内容自体のメディエーションを実施する場合など) 従って、以下の内容はその一例としてご参照下さい。ここでは、ESB 層が無かった場合に Web サービス・ クライアント(リクエスター)が受け取る SOAP メッセージと同じ内容になるように構成しています。 図 8. XSL 変換プリミティブの構成 detail 配下の CustomFault には、元の CustomFault BO 自身をそのまま移動し、faultstring には message を移動させています。faultcode には、「soapenv:Server」を割り当てる必要があります。 以上の構成を行うことで、Web サービス・クライアント(リクエスター)へ、ユーザー定義例外を送ることが 可能となります。 3. 最後に 当テクニカル・フラッシュにて説明した構成内容は、あくまで例です。ユーザー定義例外を取り扱っているた め、カスタム・メディエーション・プリミティブでの Java コードの内容はもとより、XSL 変換プリミティブでの構成に おいても、それぞれの Web サービスに応じて異なる対応が必要となります。 また Java コードの例については、その動作を保証するものではありませんので、ご自身でそれぞれの Web サービスに応じたコーディングを行い、十分なテストを実施して下さい。 なお、SOAP1.1 を例として掲載していますが、SOAP1.2 の場合も同様の問題が発生します。