...

静的サービスGWにおけるユーザー定義例外のハンドリング方法

by user

on
Category: Documents
21

views

Report

Comments

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 の場合も同様の問題が発生します。
Fly UP