コンテンツにスキップ

演習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”に編集して「送信」をクリックし、再度テスト実行します。

スクリーンショット

⑫ 以下のように異なる応答が返ってくることを確認し、「閉じる」ボタンをクリックします。

スクリーンショット

⑬ 最後に、フロー・エクササイザーの「フローを編集モードに戻します」をクリックし、フロー・エクササイザーを終了します。

スクリーンショット

戻る