レベル: 初級 増田 真, インダストリー・ソリューション・テクノロジー / ソフトウェア開発研究所, IBM
2007年 1月 19日 IBM FormWave for WebSphere(以下、FormWaveと略します。)は、IBM WebSphere Application Server(以下、WASと略します。)上で動作するJava EE(Java Enterprise Edition)技術を活用したワークフロー製品です。2006年11月にリリースされたV6.1ではFormWaveをSOA(Service Oriented Architecture)に対応させるための機能(SOA機能)が追加され、基幹業務システム(ERP/CRM/SCMなど)との連携型ワークフローがGUIベースのツールで簡単に実現できるようになりました。本稿では、SOA機能の一つであるWebサービス・ノードを利用して、ESB(Enterprise Service Bus)経由でのWebサービス連携を実現するための手順を紹介します。(本稿ではメディエーション・モジュールを開発するためにIBM WebSphere Integration Developer V6.0.2(以下、WIDと略します。)を、ESBにはIBM WebSphere Enterprise Service Bus V6.0.2(以下、WESBと略します。)を使用しています。)
Webサービス・ノードの概要
Webサービス・ノードは、FormWaveのワークフロー定義で利用できるノードの1つで、Webサービス・リクエスター機能を提供します。Webサービス・ノードに伝票が届くと、ワークフロー・エンジンはSOAP/HTTPまたはSOAP/JMSプロトコルを使って、外部のWebサービスを呼び出します。Webサービス・ノードで送受信するSOAPメッセージは、あらかじめFormWaveの開発ツールであるインターフェース・デザイナーによって定義されたインターフェース(WSDL)に対応します。そのため、図 1のようにFormWaveと他システムWebサービス・プロバイダーを接続するには、ESBのメディエーション・モジュールでインターフェースのマッピングを行います。
図 1 ESB経由でのWebサービスとの連携イメージ
本稿のシナリオ
Webサービス・ノードを利用して、ESB経由でのWebサービス連携を構築する手順には、次の4つのステップがあります。
-
インターフェース・デザイナーによるフィールドとインターフェースの定義
-
ESB開発ツールによるメディエーション・モジュールの開発
-
サービス・エンドポイント情報の登録
-
プロジェクト・デザイナーによるWebサービス・ノードの設定
本稿では、4つのステップの具体的な作業内容を紹介しながら、表 1のWebサービスをWESBでのメディエーションを経由して呼び出すFormWaveプロジェクトを作成していきます。本稿ではこれをサンプル・プロジェクトと呼ぶことにします。
表 1 Webサービスのサンプル
| サービス名 | RFQService |
|---|
| サービスの説明 | 見積要求のWebサービス |
|---|
| 内容 | 品目コード、数量などの要求情報を送信すると、見積金額、納期が回答されます。 |
|---|
| オペレーション名 | quote |
|---|
| オペレーション・タイプ | 要求-応答(Request-Response)タイプ |
|---|
本稿で紹介する作業を実際に試される方は、以下の準備を行ってください。
- FormWaveの実行環境および開発環境に加え、WIDおよびWESBが必要となりますので、準備してください。
- サンプル・コードの“RFQService.ear”を任意のWASにインストールしてください。
- メディエーション・モジュールの開発では“RFQService.ear”のWSDLファイルを使用します。“RFQService.ear”をインストールしたWASの管理コンソールから図 14と同様の手順で取得してください。
1.インターフェース・デザイナーによるフィールドとインターフェースの定義
インターフェース・デザイナーは、FormWaveのSOA機能の一部として提供されるツールです。SOA機能におけるFormWaveと他システムとのインターフェース(WSDL)を定義することができます。
このステップではインターフェース・デザイナーを使って次の3つの作業を行います。
(1)フィールド定義 (2)インターフェース定義とWSDLの生成 (3)マッピング定義
以下に、(1)~(3)の各作業について説明します。
(1)フィールド定義
FormWaveで扱う伝票のフィールドを定義します。FormWaveでフィールドを定義する方法には、プロジェクト・デザイナーを使用する方法とインターフェース・デザイナーを使用する方法があります。ここでは後者のインターフェース・デザイナーを使用する方法でフィールドを定義します。(図 2)
図 2 フィールド定義の編集画面
サンプル・プロジェクトには、Webサービスの要求および応答パラメーターと対応するフィールドのみを表 2のように定義します。ここでは便宜上、フィールド名とパラメーター名は同じにします。
表 2 サンプル・プロジェクトにおけるフィールド定義
| フィールド名 | コメント | タイプ | コンテナータイプ | 制限等 |
|---|
| userId | 要求元ユーザーID | テキスト | 標準 | 任意の文字列 | | itemCode | 品目コード | テキスト | 配列 | 英字・数字のみ | | itemQuantity | 数量 | 数値 | 配列 | 小数点以下0桁固定 | | estimatedPrice | 見積金額 | 数値 | 標準 | 小数点以下0桁固定 | | deliveryDate | 納期 | 日付 | 標準 | 日付のみ |
(2)インターフェース定義とWSDLの生成
インターフェース定義は、インターフェース・デザイナーの「インターフェース定義」タブで編集します。インターフェース定義にはWebサービスの要求・応答パラメーター、オペレーション名などを定義します。また、インターフェース定義を一意に識別するための「インターフェースID」を設定します。(図3)
図 3 “インターフェース定義”タブの編集画面
サンプル・プロジェクトでは「インターフェースID」を“RFQServiceCall”とし、パラメーターは表 3のように作成します。
表 3 サンプル・プロジェクトにおけるインターフェース定義
| パラメーター名 | 型 | 名前空間(※) | 要求/応答 |
|---|
| userId | string | xsd | 要求 | | itemCode | ArrayOfString | fcsrv | 要求 | | itemQuantity | ArrayOfInt | fcsrv | 要求 | | estimatedPrice | int | xsd | 応答 | | deliveryDate | date | xsd | 応答 |
※・・・名前空間の接頭辞は、次のそれぞれを表すものとします。
fcsrv: http://www.ibm.com/xmlns/prod/websphere/formwave
xsd: http://www.w3.org/2001/XMLSchema
WSDLファイルは、インターフェース定義の作成後に「WSDL生成」ボタンをクリックして生成します。生成する際に、エンドポイント情報を含めるかどうかを選択できますが、サンプル・プロジェクトではこの時点でFormWave側のエンドポイント情報がまだ確定していませんので、エンドポイント情報を含めないようにします。ファイル名は、“RFQServiceFW.wsdl”としておきます。
(3)マッピング定義
マッピング定義は、インターフェース・デザイナーの「マッピング定義」タブで編集します。マッピング定義では、インターフェース定義に設定した要求・応答パラメーターの値と、FormWaveのフィールド(または簡易式の評価結果)との対応関係を定義します。また、マッピング定義を一意に識別するために「マッピングID」を設定します。
サンプル・プロジェクトでは、「マッピングID」を“RFQServiceCallMap”とし、すべてのパラメーターを同一名のフィールドにマップします。この場合、「同名フィールドをマップ」ボタンをクリックするだけでマッピング定義は完成します。(図4)
図 4 “マッピング定義”タブでの編集画面
インターフェース・デザイナーでの開発はこれで終了です。サンプル・プロジェクトを任意の名前をつけて保存してください。
2.ESB開発ツールによるメディエーション・モジュールの開発
ESB開発ツールを使用して、ESBにおいてFormWaveとWebサービス・プロバイダーのインターフェースのマッピングを行うメディエーション・モジュールを開発します。
ここでは、WIDを使ってサンプル・プロジェクトで使用するメディエーション・モジュールを開発する手順を説明します。
はじめに、“RFQMediation”という名前でメディエーション・モジュール(プロジェクト)を作成し、インターフェース・デザイナーで生成した“RFQServiceFW.wsdl”と、RFQServiceのWSDLである“RFQService.wsdl”をインポートします。WSDLのインポートにより2つのインターフェースが生成されますので、それらを1つずつアセンブリー・ダイアグラムにドラッグアンドドロップして、インポートとエクスポートを作成します。このときFormWave側のインターフェースをバインディングのないエクスポートとして、Webサービス側のインターフェースをWebサービス・バインディングを持ったインポートとして作成しておきます。また、インポートのWebサービス・ポートには、“RFQ”を指定してください。(図5および図6)
図 5 WSDLのインポートとアセンブリー・ダイアグラムへのドラッグアンドドロップ
図 6 インポートの詳細(Webサービス・ポートの指定)
ここで、作成したエクスポートの名前を“FWExport”に変更し、インポートの名前を“RFQService”に変更します。
次に、エクスポートとインポートの間にメディエーション・フロー・コンポーネントを配置し、それらをワイヤで結びます。(図 7)また、メディエーション・フロー・コンポーネントの名前を“Mapping”に変更します。
図 7 メディエーション・モジュールの概要
メディエーション・フロー・エディターを開き、“Mapping”のメディエーション・フローを編集します。図 8に示すように要求タブと応答タブのそれぞれのフローにXSL変換を1つずつ配置します。
図 8 メディエーション・フローの内容
XSL変換の内容は、XMLマッピング・エディター上で入力パラメーター(ソース)を対応する出力パラメーター(ターゲット)にドラッグアンドドロップして設定します。要求フローについては図 9に示すように、応答フローについては図 10に示すように設定します。
図 9 XSL変換の内容(要求フロー)
 |
配列パラメーターを複合型にマッピングする方法
RFQServiceにおいて、“itemCode”および“itemQuantity”は“ItemInfo”という複合型のスカラー値であるのに対し、インターフェース・デザイナーでは“itemCode”および“itemQuantity”はベクター値(配列)として定義しています。そのため、双方をマッピングするにはまず図 9のようにXMLマッピング・エディター上で、 FormWave側:配列の要素 と RFQService側:“ItemInfo”の“itemCode”および“itemQuantity” をマッピングしておき、そのあとで自動生成されたXSLファイルを一部書き換えてマッピングを完成させます。
|
|
図 10 XSL変換の内容(応答フロー)
要求フローのXSL変換では、配列から複合型への特殊なマッピングを行いますので、XMLマッピング・エディターでの設定に加えてXSLファイルの編集が必要です。
図 11 要求フローのXSL変換のプロパティーでXSLファイルの所在を確認する
XMLマッピング・エディターで自動生成されたXSLファイルの所在は、メディエーション・フロー・エディターの要求フローのXSL変換のプロパティーで確認できます。(図 11)
そのファイルを「物理リソース」ビューから開き、『<xsl:template name=“ItemInfo”>』の内容をリスト1からリスト2に書き換えます。
リスト1 編集前
<xsl:template name="ItemInfo">
<ItemInfo>
<itemCode>
<xsl:value-of select="/body/quote/itemCode/arrayElement/text()"/>
</itemCode>
<itemQuantity>
<xsl:value-of select="/body/quote/itemQuantity/arrayElement/text()"/>
</itemQuantity>
</ItemInfo>
</xsl:template>
|
リスト2 編集後 ※太字で示した部分が追記および変更する部分です。
<xsl:template name="ItemInfo">
<xsl:for-each select="/body/quote/itemCode/arrayElement">
<xsl:variable name="pos">
<xsl:value-of select="position()"/>
</xsl:variable>
<ItemInfo>
<itemCode>
<xsl:value-of select="./text()"/>
</itemCode>
<itemQuantity>
<xsl:value-of select="/body/quote/itemQuantity/arrayElement[position()=$pos]/text()"/>
</itemQuantity>
</ItemInfo>
</xsl:for-each>
</xsl:template>
|
最後に、アセンブリー・ダイアグラムにおいてエクスポートにWebサービス・バインディングを生成します。このとき、サンプル・プロジェクトではトランスポートに“soap/http”を選択します。これにより、FormWaveから見たサービス・エンドポイント情報が確定します。
以上でメディエーション・モジュールは完成です。
完成したメディエーション・モジュールは、インテグレーション・モジュール(サーバー・デプロイメント用EARファイル)としてエクスポートしてWESBにインストールしますが、その前にWIDのテスト環境を使用してテストをしておくとよいでしょう。(図 12)
図 12 メディエーション・モジュールのテス
メディエーション・モジュールをWESBへインストールするには、WESBの管理コンソールを使用します。管理コンソールの左ペインより、「アプリケーション」→「新規アプリケーションのインストール」の順にクリックし、「新規アプリケーションへのパス」にはWIDからエクスポートしたEARファイル(“RFQMediation.ear”)を指定します。特に設定を変更する必要はありませんので、「次へ」をクリックしてインストールを進めてください。途中でMessage-driven Beanのリスナー・バインディングに関して、アプリケーション・リソースの警告が表示されることがありますが、無視して作業を継続してください。
3.サービス・エンドポイント情報の登録
エンドポイント定義の登録には、FormWave管理サービスのエンドポイント定義機能を使用します。
FormWaveの管理サービスにログインして、左ペインの「環境設定」を展開し、「サービスエンドポイント」を選択すると、登録されているエンドポイント定義が表示されます。
「追加」ボタンをクリックし、「サービスエンドポイントの設定」ダイアログに値を設定して「OK」ボタンをクリックすると、エンドポイント定義が登録されます。(図 13)
図 13 エンドポイント定義の登録画面
エンドポイント定義には、接続先となるサービス・エンドポイントの情報を設定します。また、エンドポイント定義を一意に識別するために、「エンドポイントID」を設定します。
サンプル・プロジェクトでは、WESBの管理コンソールからWSDLを含むzipファイルをダウンロードし(図 14)、その中に含まれるエクスポートのWSDLに従って表 4に示すように設定します。
図 14 WESBの管理コンソールからWSDLを含むzipファイルをダウンロード
表 4 エンドポイント定義の設定内容
| 設定項目 | 設定値 |
|---|
| エンドポイントID | “RFQServiceCallEP” | | サービス名 | “FWExport_quotePortTypeHttpService” | | エンドポイントアドレス | “http://XXXX:NNNN/RFQMediationWeb/sca/FWExport” (※) | | ポート名 | “FWExport_quotePortTypeHttpPort” | | コメント | 例)RFQMediationのエクスポート | | 用途タイプ | “リクエスター”を選択 |
※・・・・“XXXX”にはWESBのアドレス、“NNNN”にはWESBのポート番号が入ります。
4.プロジェクト・デザイナーによるWebサービス・ノードの設定
FormWaveのプロジェクト・デザイナーを使って経路定義を編集し、外部のWebサービスを呼び出したい場所にWebサービス・ノードを配置します。Webサービス・ノードには、そのノードで使用するインターフェース定義、マッピング定義およびエンドポイント定義のIDを設定します。これらのIDはすでに登録されている定義の中から選択して設定しますので、事前に必要な情報はすべて登録しておく必要があります。
サンプル・プロジェクトでは、「インターフェース・デザイナーによるフィールドとインターフェースの定義」の最後で保存したファイルをプロジェクト・デザイナーで開き、以下のように編集します。
はじめに、「起票者→Webサービス・ノード→ノード参照」という経路定義を作成し、「ノード参照」では「起票者」を指定します(図 15)。次に、起票者のレイアウトに“RequestForQuotation.jsp”を、ノード参照のレイアウトに“Quotation.jsp”を指定します。
図 15 伝票経路の定義
最後にWebサービス・ノードのプロパティーを設定します。ここまでの作業で作成したインターフェース定義、マッピング定義およびエンドポイント定義のIDを表 5のように設定してください。
表 5 Webサービス・ノードのプロパティー
| プロパティー名 | 設定する値 |
|---|
| ノード名 | 例) “RFQService” | | インターフェースID | “RFQServiceCall”を選択 | | マッピングID | “RFQServiceCallMap”を選択 | | エンドポイントID | “RFQServiceCallEP”を選択 |
以上でサンプル・プロジェクトが完成しましたので、サーバーに登録します。レイアウト・ファイルも忘れずにサーバーに配置してください。
サンプル・プロジェクトの実行
FormWaveのクライアント・サービスにログインしてサンプル・プロジェクトを起票します。サンプル・プロジェクトは、Webサービス・ノードの次に起票者へ届くように定義してありますので、起票したユーザーでRFQServiceの応答がフィールドに反映されていることを確認できます。また、RFQServiceは要求値に基づき、次のような応答を返します(表 6)。
表 6 RFQServiceの応答内容
| 応答パラメーター | 値 |
|---|
| deliveryDate | 14日後の日付を返します。 | | estimatedPrice | ある規則に従って計算した金額を返します。 |
まとめ
本稿では、IBM FormWave for WebSphereのWebサービス・ノードを使って、ESB経由で他システムのWebサービスと連携する手順を説明しました。SOAP/HTTPを使った要求-応答型のWebサービスとの連携について説明しましたが、片方向型のWebサービスとの連携やSOAP/JMSを使った非同期連携なども、同様の手順で、簡単に構築することができます。興味をお持ちになった方は試してみてください。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| ご使用前にエンドポイント定義の登録が必要です。 | FormWaveProject.zip | 5 KB | HTTP |
|---|
| RFQService(インポート)のエンドポイントを編集してご使用ください。 | RFQMediation_ProjectInterchange.zip | 15 KB | HTTP |
|---|
| WASにインストールしてご使用ください。 | RFQService.ear | 78 KB | HTTP |
|---|
参考文献
著者について  | |  | 増田真は、ソフトウェア開発研究所のエンジニアで、IBM FormWave for WebSphereの製品開発業務に従事しています。 |
記事の評価
|