演習3. Webサービス連携処理の開発
演習の目的:
この演習では、ACEがMQアプリケーションのWebサービスWrapperとして動作する、サービス連携処理の開発方法を学習します。
以下のことを体験します。 - メッセージ・モデルの作成 - WSDLのインポート - WSDLからのメッセージ・フローの生成 - マッピング・ノード(GUI)によるマッピング - テスト
目次
3.1 シナリオの概要
この演習ではSOAP/HTTP→CSV/MQの変換を行います。
バックエンドの顧客情報検索プログラム(MQアプリケーション)は、要求キューに投入されたメッセージを受信し、メッセージの中の顧客番号に紐づく顧客情報をCSV形式の応答メッセージとして応答キューに送信します。
ACEのメッセージ・フロー要求部分は、SOAPリクエストを受信し、WSDLから生成されたメッセージ・モデルに基づいて入力メッセージをパースし、項目のマッピングとフォーマットの変換(XML→CSV)を行ってキューにメッセージをPUTします。
メッセージ・フロー応答部分は、バックエンドからの応答MQメッセージを受信し、定義されたメッセージ・モデルに基づいてメッセージをパースし、項目のマッピングとフォーマットの変換(CSV→XML)を行って、クライアントにSOAP応答を返します。
3.2 演習の準備
3.2.1 演習に使用するキューの作成
演習に必要なキューを作成します。
本演習ではFL2.REQ, FL2.REPの2つのキューを使用します。
① MQエクスプローラーを開き、既に作成済のキュー・マネージャー「ACE13QMGR」の下の「キュー」フォルダーを右クリックし、「新規」→「ローカル・キュー」を選択します。
② 新規ローカル・キュー画面で名前フィールドに「FL2.REQ」を入力し、「終了」ボタンをクリックします。
③ ①~②の手順を繰り返して、「FL2.REP」を作成します。
3.3 アプリケーションの作成
3.3.1 ツールキットの起動
ACEツールキットを起動します。スタート・ボタン→「IBM App Connect Enterprise 13.0.6.0 Evaluation Edition」→「IBM App Connect Enterprise Toolkit 13.0.6.0」を選択します。
3.3.2 アプリケーションの作成
① ツールキットの左のアプリケーション開発タブの「新規」リンクをクリックし、「アプリケーション」を選択します。
② アプリケーション名に「WebServiceScenario」と入力して「終了」をクリックします。
③ アプリケーション「WebServiceScenario」が作成されたことを確認します。
3.4 メッセージ・モデルの作成
ACEのパーサーはCSVや固定長のデータを扱う際、メッセージ・モデルを参照して処理するデータのパースやシリアライズを行います。入出力データのCSV用のメッセージ・モデルをウィザードで作成します。
3.4.1 入出力用メッセージ・モデルの作成
まず、MQアプリケーションへの要求送信用のCSV形式のメッセージ・モデルを作成します。
定義するCSVファイルは次のような形式で、1つのフィールドを持ちます。これをmqMessageReqという名前で定義します。
① アプリケーション「WebServiceScenario」内の「(新…)」をクリックし、「メッセージ・モデル…」を選択します。
② 新規メッセージ・モデル作成用のウィザードが起動するため、「CSVテキスト」を選択して「次へ」をクリックします。
③ 「このウィザードに従ってDFDLスキーマ・ファイルを作成する」を選択し、「次へ」をクリックします。
④ DFDLスキーマ・ファイル名に「mqMessageReq」と入力します。メッセージ名には自動的に同じ名前が設定されるため、そのまま「次へ」をクリックします。
⑤ フィールド数に「1」を入力して「終了」をクリックします。
⑥ DFDLエディターが開くため、フィールド名を「id」に修正します。
⑦ Ctrl + sで保存します。以上の操作でMQアプリケーションへの要求送信用のCSV形式のメッセージ・モデルが完成です。
同様にして、MQアプリケーションからの応答受信用のCSV形式のメッセージ・モデルを作成します。
定義するCSVファイルは次のような形式で、4つのフィールドを持ちます。これをmqMessageRepという名前で定義します。
⑧ アプリケーションWebServiceScenarioを右クリックし、「新規」→「メッセージ・モデル…」を選択します。
⑨ 新規メッセージ・モデル作成用のウィザードが起動しますので、「CSVテキスト」を選択して「次へ」をクリックします。
⑩ 「このウィザードに従ってDFDLスキーマ・ファイルを作成する」を選択し、「次へ」をクリックします。
⑪ DFDLスキーマ・ファイル名に「mqMessageRep」と入力します。「メッセージ名」には自動的に同じ名前が設定されるため、そのまま「次へ」をクリックします。
⑫ フィールド数に「4」を入力して「終了」をクリックします。
⑬ DFDLエディターが開きますので、下記のようにフィールド名を修正します。
フィールド名はそれぞれ「custId」、「custName」、「custAddr」、「custPostcd」です。
⑭ Ctrl + sで「mqMessageRep」を保存します。以上の操作でMQアプリケーションからの応答受信用のCSV形式のメッセージ・モデルが完成です。
3.4.2 WSDLのインポート
WebサービスのWSDLをインポートしてメッセージ・モデルを定義します。 ① アプリケーションWebServiceScenarioを右クリックし、「新規」→「メッセージ・モデル…」を選択します。
② メッセージ・モデル作成用のウィザードが起動するため、「SOAP XML」を選択して「次へ」をクリックします。
③ 「マイ・データには既にWSDLがある」を選択して「次へ」をクリックします。
④ 「ワークスペース外のファイルを選択する」にチェックを入れ、「C:\students\WSDL\CustomerQuery.wsdl」を選択し、「次へ」をクリックします。
⑤ インポートするWSDLバインディングを確認して「終了」をクリックします。
WSDLがインポートされます。
⑥ インポートされたWSDL定義を確認します。CustomerQuery.wsdlをクリックしてWSDLエディターを開きます。
(以下の画面にならない場合は設計タブをクリックしてください。)
⑦ WSDLエディターで、getCustomerByIdオペレーションのinputとoutputのデータの定義が確認できます。まず、inputのデータの定義を確認します。
inputの右側の→の上にマウスを持っていくと、スキーマ定義の画面が表示されます。getCustomerByIdには、「id」というstring型の項目が1つ定義されていることがわかります。
⑧ 次に、getCustomerByIdオペレーションのoutputのデータの定義を確認します。
outputの右側の→の上にマウスを持っていくと、スキーマ定義の画面が表示されます。getCustomerByIdResponseには、「result」というCustomer型の項目が1つ定義されていることがわかります。
⑨ Customer型の詳細を確認するために、「新規エディターで開く」をクリックします。
⑩ スキーマ・エディターが開きます。 getCustomerByIdResponseTypeをダブルクリックします。
Customer型の詳細は4つのString型の項目を持つ定義であることが分かります。
⑪ 開いた画面を閉じます。
以上の操作で入出力用のメッセージ・モデルが作成されました。
3.5 メッセージ・フローの作成
次にメッセージ・フローを作成します。
3.5.1 メッセージ・フローの作成
① アプリケーション開発タブでWebServiceScenarioを右クリックしてメニューより「新規」→「メッセージ・フロー」を選択します。
② メッセージ・フロー名に「WebServiceScenario」を入力し、「終了」をクリックします。
③ インポートしたWSDLからWebサービスを構成します。WebServiceScenarioアプリケーションのWSDL定義のCustomerQuery.wsdlを選択し、メッセージ・フロー・エディターにドラッグ&ドロップします。
④ ウィザードが実行されます。デフォルトのまま「次へ」をクリックします。
⑤ 次の画面でもデフォルトのまま「終了」をクリックします。
Webサービス用のSOAPInputノードとサブフロー、SOAPReplyノードが自動的に追加されます。
3.5.2 MQInput ノード、MQOutput ノード、Mappingノードの配置
① メッセージ・フロー・エディター左端のパレットにて「コネクター」セクション内の「IBM MQ」タブを展開し、「MQInput」ノード、「MQOutput」ノードをドラッグ&ドロップして、以下のように追加します。
② メッセージ・フロー・エディター左端のパレットにて「ツールボックス」セクション内の「変換」タブを展開し、「Mapping」ノードを2つドラッグ&ドロップして、以下のように追加します。
③ 以下のようにノード間を接続します。
Note
マッピングを間違えた際にはCtrlキー + Zまたは画面上部の「元に戻す」ボタンで取り消すことができます。
④ MQInputノード、MQOutputノードのプロパティーを設定します。
- MQInputノードのプロパティー設定
| タブ | プロパティー | 設定値 |
|---|---|---|
| 基本 | キュー名 | FL2.REP |
| 入力メッセージの構文解析 | メッセージ・ドメイン | DFDL |
| メッセージ | {}:mqMessageRep |
- MQOutputノードのプロパティー設定 | タブ | プロパティー | 設定値 | | :-------------------- | :------------- | :-------------- | | 基本 | キュー名 | FL2.REQ |
(キュー・マネージャー名は指定せず、ブランクのままにしてください。)
3.5.3 Mappingノードの構成
当演習のメッセージ・フローでは、メッセージ本体のマッピング以外に、以下のような処理の実装を行います。
-
要求フローの処理
LocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierをMQMD.MsgIdへコピー -
応答フローの処理
MQMD.CorrelIdをLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierへコピー
要求フローと応答フローの関連付け(応答先クライアントの識別)について
SOAPInputノードでは、メッセージ・ツリーのRootエレメント配下のHTTPInputHeaderにHTTPヘッダーを展開し、LocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierにリクエストを一意に識別するIDを保管します。SOAPReplyノードはこのReplyIdentifierを参照して応答を返すクライアントを一意に判断します。
今回のように、要求フローと応答フローが分かれる場合には、要求フローと応答フローの間で、このReplyIdentifierを引き継ぐ必要があり、MQを介したアプリケーションの場合には、MQヘッダー(MQMD.MsgId、MSMD.CorrelId)にこのIDを保持しながら引き継ぐ方法をとるのが一般的です。
具体的には上図のような処理を行いながら、ReplyIdentifierを持ちまわります。上図の処理のうち、(2)はバックエンドのアプリケーションで実施されている前提ですので、(1)と(3)の処理をメッセージ・フローの中で行う必要があります。この処理を当演習ではMappingノードの中で実装します。
要求フローでのHTTPヘッダー(HTTPInputHeader)の削除について
-メッセージ・ツリーのMQMDの配置順序について
ACEのメッセージ・ツリーでは、MQヘッダー(MQMD)を扱う場合、メッセージ・ツリーのRootエレメント配下の要素の順序は、Properties→MQMDの順番となっている必要があります。
当演習の要求フローでは入力がSOAPInputノードであるため、Rootエレメントの配下の要素の順序は、Properties→HTTPヘッダー(HTTPInputHeader)となり、かつ、MQOutputへ出力するためMQヘッダー(MQMD)を扱う必要があります。従って、HTTPヘッダー(HTTPInputHeader)を削除することで、MQヘッダー(MQMD)のRootエレメント配下の配置順序を、Properties→MQMDとなるように操作する必要があります。
この処理を当演習ではMappingノードの中で実装します。
要求フローのMappingノードを構成します。
要求フローの変換の内容は、以下の通りです。 - SOAP Inputノードで受信したメッセージの中身getCustomerByIdから、mqMessageReqへマッピング - LocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierをMQMD.MsgIdへコピー - HTTPヘッダー(HTTPInputHeader)の削除
① 要求フローのMaggpingノードをダブルクリックします。
② ウィザードが開始されます。「次へ」をクリックします。
③ マップの入力と出力でそれぞれ「getCustomerById」、「mqMessageReq{}」を選択し、「終了」をクリックします。
④ マッピング画面が表示されます。オーバーライド内の「Assign」をクリックし、プロパティーを確認します。自動的に「{}:mqMessageReq」が設定されていることを確認します。
⑤ 入力側の「getCustomerById」の「id」をクリックしたまま、出力側の「mqMessageReq」内「record」の「id」へ移動し、マッピングを行います。
Mappingノードでは、メッセージ・ヘッダーやLocalEnvironmentツリーなどはデフォルトではマッピング・エディター上に表示されないため参照・更新操作ができません。ここではLocalEnvironmentツリーをマッピング・エディターに表示させる操作を行います。
⑥ マッピングの入力側へLocalEnvironmentツリーを追加します。 マッピング画面の入力側(左側)のメッセージ・アセンブリーgetCustomerByIdをクリックし、「プロパティー」タブの「ヘッダーとフォルダー」の「Properties」リンクをクリックします。
⑦ LocalEnvironmentにチェックを追加し、「OK」をクリックします。
マッピングの出力側へMQヘッダーのMQMDと、HTTPヘッダーのHTTPInputHeaderを追加します。
⑧ マッピング画面の出力側(右側)のmqMessageReqの一番上の部分をクリックし、「プロパティー」タブの「ヘッダーとフォルダー」の「Properties」リンクをクリックします。
⑨ 「MQヘッダー」の「MQMD」と、「HTTPヘッダー」の「HTTPInputHeader」にチェックを追加し、「OK」をクリックします。
⑩ LocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierからMQMD.MsgIdへ以下のようにマッピングを行います。
※ここで実装したいこととして、出力側のHTTPInputHeaderの削除がありますが、Mappingノードでは、マッピング・エディターにHTTPInputHeaderを追加することで、HTTPInputHeaderの削除を行うことができます。(マッピングを何も実装せずに配置する必要があります。)
⑪ Ctrl + sで保存します。
次に応答フローのMappingノードを構成します。
応答フローの変換の内容は、以下の通りです。
- MQ Inputノードで受信したメッセージの中身mqMessageRepから、SOAP Replyノードに渡すためのメッセージとなるgetCustomerByIdResponseへの変換
- MQMD.CorrelIdをLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierへコピー
① 応答フローのMaggpingノードをダブルクリックします。
② ウィザードが開始されます。「次へ」をクリックします。
③ マップの入力と出力を以下のように選択します。「次へ」をクリックします。
④「出力ドメイン」に「XMLNSC」が設定されていることを確認して「終了」をクリックします。
⑤ マッピング画面が表示されます。
⑥ 自動マップの機能を使ってマッピングを行います。
「入力から出力への自動マップ」をクリックします。
⑦ 以下の画面で、自動マップの設定を行います。
「マッピング基準」で「入力と出力の名前が基準より類似している場合に変換を作成」にチェックを入れ、一致率を30%に設定します。
このように設定することで、項目の名前が30%の一致率以上の場合に自動的にマッピングが行われます。
「Next」をクリックします。
⑧ 前画面の設定を満たすマッピングの候補が表示されます。確認をして「終了」をクリックします。
以下のようにマッピングされます。
⑨ マッピングの入力側へMQヘッダーのMQMDを追加します。
マッピング画面の入力側(左側)のmqMessageRepの一番上の部分をクリックし、「プロパティー」タブの「ヘッダーとフォルダー」の「Properties」リンクをクリックします。
⑩ 「MQヘッダー」の下の「MQMD」にチェックを追加し、「OK」をクリックします。
⑪ マッピングの出力側へLocalEnvironmentツリーを追加します。
マッピング画面の出力側(右側)のgetCustomerByIdResponseの一番上の部分をクリックし、「プロパティー」タブの「ヘッダーとフォルダー」の「Properties」リンクをクリックします。
⑫ LocalEnvironmentにチェックを追加し、「OK」をクリックします。
⑬ MQMD.CorrelIdからLocalEnvironment.Destination.SOAP.Reply.ReplyIdentifierへ以下のようにマッピングを行います。
⑭ Ctrl + sで開いているすべてのタブを保存します。
3.6 開発物のテスト
今回のテストでは、バックエンドのMQアプリケーションとしてACEのメッセージ・フローを利用します。
あらかじめBARファイルを用意してあるため、テストの前にデプロイを行います。
① Windowsのエクスプローラーを開き、C:\students\Bar\CustomerMQApp.barファイルをツールキットのWebServiceScenarioアプリケーションへドラッグ&ドロップで追加します。
② WebServiceScenarioの中に追加されたCustomerMQApp.barをドラッグ&ドロップで統合サーバー「ACE13SERVER」へデプロイします。
これで、バックエンドアプリケーションの準備は完了です。
③ メッセージ・フローWebServiceScenarioのフロー・エクササイザーの開始ボタンをクリックします。
④ 以下のポップアップ画面で、「はい」を選択します。
⑤ 以下のポップアップ画面が出たら、「このメッセージを再度表示しない」をチェックし、「閉じる」をクリックします。
⑥ 「フローにメッセージを送信します」のボタンをクリックします。
⑦ 「新規メッセージ」のボタンをクリックします。
⑧ 「new message 1」をクリック後、右側のメッセージ本文にデータ内id要素を「123」に編集し、「送信」をクリックします。
応答メッセージを確認します。
バックエンドのMQアプリケーションは、入力のidとしては、”123”, “456”, “789” 用の応答メッセージを用意しています。入力のidを変更して、応答メッセージが変わることを確認してみましょう。
⑨ フロー・エクササイザーの「フローにメッセージを送信します」を再度クリックします。
⑩ 既に作成されている「new message 1」を選択した状態で、「現在選択しているメッセージを複写します」をクリックし、「名前」でメッセージ名を任意のものに変更し、適用をクリックします。
⑪ 入力メッセージのidを”456”に編集して「送信」をクリックし、再度テスト実行します。
⑫ 以下のように異なる応答が返ってくることを確認し、「閉じる」ボタンをクリックします。
⑬ 最後に、フロー・エクササイザーの「フローを編集モードに戻します」をクリックし、フロー・エクササイザーを終了します。





















































































