Comments
Transcript
メッセージ・フローの開発 目次 メッセージ・フローの開発手順 主要なプロセス・ノード
メッセージ・フローの開発 目次 メッセージ・フローの開発手順 主要なプロセス・ノード ESQL解説 トランザクション制御 エラー処理 メッセージ・フロー・デザインTips 当資料では、WMB の導入/運用から、アプリケーションの実装に至るまで、一通りの機能について詳細に解説しています。 当資料は、WMBv6.1をベースに作成しています。 当資料はIBMの正式なレビューを受けていません。当資料に含まれる全ての情報は、利用者の責任において使用される べきものであり、特定環境への適用は利用者の判断に依存します。 2 メッセージ・フローの 開発手順 3 メッセージ・フローの実行 メッセージ・フローの実行 メッセージ・フローは、実行グループ(DataFlowEngineプロセス)上でスレッド実行される プロセス・ノードの実体は共有ライブラリ メッセージ・フローの実行スレッドが定義に従って、順次、共有ライブラリの関数を呼び出す 実行グループは、入力ノードに実行スレッドを割り当て 入力ノードはメッセージの到着を待ち受け、メッセージ到着をトリガーに処理を開始 –MQInputノードの場合、MQGET WAITでメッセージを待機 ブローカー(bipservice、bipbroker) 実行スレッド 実行グループ(DataFlowEngine) メッセージ・フロー1 メッセージ・フロー1 メッセージのパース メッセージ・フロー2 メッセージの組み立て 実行グループ(DataFlowEngine) メッセージ・フロー1 4 メッセージ・フローの実行 1つのプロセス・ノードに複数の後続処理をつけることが可能 ただし、後続処理は並行実行されない 1つのスレッドが逐次実行 同一スレッドがメッセージ・フローを最後まで実行 実行スレッド メッセージ・フローに複数の入力ノードを配置可能 ただし、単純に別スレッドで並行実行されるだけ (メッセージをマージするわけではない) 実行スレッド 2つのメッセージ・フローを実行しているのと同等 実行スレッド 5 メッセージ・フローの実行 メッセージ・フローと論理メッセージ・ツリー メッセージ・フローに入力されたメッセージはメッセージ・ツリー(Root)に変換される メッセージ・ツリーと共に3つの論理メッセージ・ツリーが作成され、メッセージ・フローを流れる 環境ツリー(Environment)、ローカル環境ツリー(LocalEnvironment) –どちらもプロセス・ノード間での情報の受け渡しに使用 (詳細は後述) 例外ツリー(ExceptionList) –エラー発生時にエラー情報を記録 例外ツリー(ExceptionList) 環境ツリー(Environment) ローカル環境ツリー(LocalEnvironment) メッセージ・ツリー(Root) Root Properties MQMD (Domain) Customer Name メッセージ・フロー Address City いずれの論理メッセージ・ツリーも、1つのメッセージ処理が終わると削除 論理メッセージ・ツリーでは、メッセージ・フロー・インスタンス間、後続のメッセージ処理には情報を引継げない 6 メッセージ・フロー関連のリソース メッセージ・フロー・プロジェクト ブローカー・スキーマ メッセージ・フロー・プロジェクト 名前衝突を防ぐためのネームスペース ブローカー・スキーマ メッセージ・フロー メッセージ・フロー ESQLファイル メッセージ・フロー msgmapファイル メッセージの変換ロジックなどを記述した ESQLモジュールを含むファイル Computeノードなどから参照される ESQLファイル ESQLモジュール マッピング記述 ESQLモジュール msgmapファイル プロジェクト参照 マッピング変換ロジックを記述したファイル Mappingノードなどから参照される メッセージ・セット・プロジェクト メッセージ・フロー・プロジェクトからメッセージ・セット・プロジェクトに対して参照関係を設定 ESQLモジュールの開発時、メッセージ名やエレメント名の入力を補助 7 プロジェクト参照、入力補助 <参考> プロジェクト参照、ESQL入力補助 ESQLエディターやMappingエディターで入力補助機能(Content-Assist)を利用可能 利用可能な他プロジェクトのメッセージ定義やfunctionをリスト表示させることができる ①「メッセージ・フロー・プロジェクト」を選択して右クリック. ポップアップ・メニューから「プロパティ」を選択 ②参照するメッセージ・セット・プロジェクトをチェックして「OK」 8 ③ESQLを記述するとき、「Ctrl + SPACE」キーで メッセージ定義を参照可能(入力補助) メッセージ・フロー開発 手順 メッセージ・フロー・プロジェクトの作成 ①「ブローカー・アプリケーションの開発」パースペクティブを選択 ②「ブローカー開発」ペインで右クリック. ポップアップ・メニューから「新規」→ 「メッセージ・フロー・プロジェクト」を選択 ③プロジェクト名を入力して「終了」 9 メッセージ・フロー開発 手順 メッセージ・フローの作成 ①メッセージ・フローを作成するプロジェクトを選択 ②「ブローカー開発」ペインで右クリック. ポップアップ・メニューから「新規」→ 「メッセージ・フロー」を選択 ③メッセージ・フロー名を入力して「終了」 10 メッセージ・フロー開発 手順 プロセス・ノードの配置、ターミナルの接続 ①パレットから使用するプロセス・ノードを選択し、 キャンバス上で左クリック ③「Out」を選択して「OK」 ②プロセス・ノードを選択して右クリック. ポップアップ・メニューから「接続の作成」を選択 ④接続先のプロセス・ノードの上で、左クリック 11 メッセージ・フロー開発 手順 プロパティの設定 ①プロセス・ノードを選択すると、プロパティー 画面が表示 ②関連するプロパティがタブでまとめられている. タブを切り替えながら、プロパティに値を設定 12 メッセージ・フロー開発 手順 ESQLの開発 メッセージ・フローと同名のESQLファイルを自動作成 プロパティに設定されている名前の ESQLモジュールを自動生成 ①プロセス・ノードの「ESQLモジュール」プロパティを 適切な名前に変更 ②プロセス・ノードを選択して右クリック. 「ESQLを開く」を選択 13 blank 14 メッセージ・フローのデプロイと実行時属性 メッセージ・フローの実行 開発したメッセージ・フローは、ブローカーにデプロイして実行 メッセージ・フローを複数インスタンスで実行することが可能 同一の実行グループ、別の実行グループのどちらでも可 同一の実行グループで複数インスタンス実行するときは、実行時属性「追加インスタンス」を設定して デプロイ 別の実行グループで実行するときは、メッセージ・フローをそれぞれの実行グループに向けてデプロイ 「追加インスタンス」の設定はフローレベルでの指定とノードレベルでの指定が可能 1フロー内に複数の入力ノードがある場合、追加インスタンスをフローレベルで指定すると、どの入力ノード が複数スレッドで実行されるかわからない 入力ノード単位に追加のインスタンス数を指定することが可能 –MQInputノード、FileInputノード、SOAPInputノード、WebSphere Adaptersノード ノード・プロパティの「インスタンス」タブで、ノードレベル / フローレベルどちらで「追加インスタンス」の指定を 行うかを設定 ブローカー(bipservice、bipbroker) 実行グループ(DataFlowEngine) メッセージ・フロー1 メッセージ・フロー1 メッセージ・フロー2 実行グループ(DataFlowEngine) メッセージ・フロー1 15 メッセージ・フローのデプロイと実行時属性 実行時属性 ブローカー・アーカイブファイルの「構成」タブで、実行時の動作に影響を与える追加プロパ ティーの指定が可能 メッセージ・フローの構成可能プロパティ 属性 説明 整合トランザクション 2PCを行うために、MQBEGINを発行 コミット間隔 メッセージがコミット・カウントに満たないとき、コミットを待機する時間 コミット・カウントが1より大きいときのみ有効 コミット・カウント メッセージを何件処理するごとにコミットするか 追加インスタンス メッセージ・フローの追加起動数 コンシューマー・ポリシー・セット WS-Security使用時に使用するポリシー・セット名 コンシューマー・ポリシー・セットのバインディング WS-Security使用時に使用するポリシー・セット・バインディング名 モニター・プロファイル名 メッセージ・フローのモニタリングに使用するプロファイル名 プロバイダー・ポリシー・セット WS-Security使用時に使用するポリシー・セット名 プロバイダー・ポリシー・セットのバインディング WS-Security使用時に使用するポリシー・セット・バインディング名 セキュリティー・プロファイル名 WS-Security使用時に使用するセキュリティ・プロファイル名 - 「コミット間隔」、「コミット・カウント」は、パフォーマンス向上のためのオプション.コミット回数を減らしてCPU負荷を下げる. - 「整合トランザクション」はMQをコディネータとしてデータベース、JMSプロバイダーを2PCするときに設定(詳細は後述) その他、一部ノードプロパティの上書きが可能 16 ノードの構成可能プロパティー <参考> 各ノードの構成可能プロパティー ノード名 構成可能プロパティー MQInput キュー名、追加インスタンス、追加インスタンス・プール、参照タイムアウトのリセット、セキュリティー・プロファイル、z/OSシリアライゼーション・トー クン、トピック、妥当性検査 MQOutput キューマネージャー名、キュー名、応答先キュー、応答先キューマネージャー、セキュリティー・プロファイル、妥当性検査 MQGet キュー名、妥当性検査 MQOptimizedFlow キュー名 MQReply 妥当性検査 MQHeader 宛先のキューマネージャー名、宛先キュー名、応答先キュー、キューマネージャーへの応答 SCADAInput 最大スレッド、ポート、妥当性検査 SCADAOutput 妥当性検査 HTTPInput 障害フォーマット、セキュリティー・プロファイル、URLのパス接尾部、HTTPSの使用、妥当性検査 HTTPRequest 認可されたSSL暗号、HTTP/1.1キープアライブを使用可能にする、HTTP(S)プロキシーの位置、HTTPバージョン、プロトコル、セキュリ ティー・プロファイル、WebサービスURL、妥当性検査 HTTPReply 妥当性検査 SOAPInput 追加インスタンス、追加のインスタンス・プール、長い再試行間隔(秒)、最大クライアント待機時間(秒)、ポリシー・セット、 ポリシー・セット・バインディング、再試行しきい値、セキュリティー・プロファイル、インバウンド処理障害をfailureターミナルに経路指定します、 短い再試行間隔(秒)、URLセレクター、HTTPSの使用、失敗時の処置、妥当性検査 SOAPReply MTOMの許可、妥当性検査 SOAPRequest MTOMの許可、ポリシー・セット、ポリシー・セット・バインディング、セキュリティー・プロファイル、SSLプロトコル(SSLを使用中の場合)、失敗 時の処置、妥当性検査、WebサービスURL SOAPAsyncRequest MTOMの許可、固有ID、ポリシー・セット、ポリシー・セット・バインディング、セキュリティー・プロファイル、SSLプロトコル(SSLを使用中の場 合)、WebサービスURL SOAPAsyncResponse 追加インスタンス、固有ID、追加のインスタンス・プール、失敗時の処置、妥当性検査 17 ノードの構成可能プロパティー ノード名 構成可能プロパティー RegistryLookup 名前、ネームスペース、バージョン、テンプレート <参考> EndpointLookup PortTypeの名前、PortTypeのネームスペース、PortTypeのバージョン JMSInput バックアウト宛先、接続ファクトリー名、永続サブスクリプションID、初期コンテキスト・ファクトリー、ロケーションJNDIバインディング、ソース・キュー、 サブスクリプション・トピック、妥当性検査 JMSOutput 接続ファクトリー名、宛先キュー、初期コンテキスト・ファクトリー、ロケーションJNDIバインディング、宛先に応答、パブリケーション・トピック、ローカ ル環境の送信先宛先リスト、妥当性検査 JMSReply 接続ファクトリー名、初期コンテキスト・ファクトリー、ロケーションJNDIバインディング、ローカル環境の送信先宛先リスト、 妥当性検査 JMSHeader JMSの応答先 Real-timeInput 認証スレッド、ポート、読み取りスレッド、書き込みスレッド Real-timeOptimizedFlow 認証スレッド、ポート、読み取りスレッド、書き込みスレッド FileInput 追加インスタンス、追加のインスタンス・プール、FTP、FTPサーバーおよびポート、セキュリティーID、ファイル名またはパターン、 入力ディレクトリー、長い再試行間隔(秒)、メッセージ・コード化文字セットID、メッセージのエンコード、再試行しきい値、 短い再試行間隔(秒)、妥当性検査、ポーリング間隔(秒) FileOutput FTP、FTPサーバーおよびポート、セキュリティーID、ディレクトリー、ファイル名またはパターン、ディレクトリー・プロパティー・ロケーションの要求、 ファイル名プロパティー・ロケーションの要求、妥当性検査 TCPIPClientInput 追加インスタンス、追加のインスタンス・プール、接続の詳細、長い再試行間隔(秒)、メッセージ・コード化文字セットID、メッセージのエンコー ド、再試行しきい値、短い再試行間隔(秒)、データ・レコード待機のタイムアウト(秒)、妥当性検査 TCPIPClientOutput 接続の詳細、データ・レコード送信のタイムアウト(秒)、妥当性検査 TCPIPClientReceive 接続の詳細、メッセージ・コード化文字セットID、メッセージのエンコード、データ・レコード待機のタイムアウト(秒)、妥当性検査 TCPIPServerInput 追加インスタンス、追加のインスタンス・プール、接続の詳細、長い再試行間隔(秒)、メッセージ・コード化文字セットID、メッセージのエンコー ド、再試行しきい値、短い再試行間隔(秒)、データ・レコード待機のタイムアウト(秒)、妥当性検査 TCPIPServerOutput 接続の詳細、データ・レコード送信のタイムアウト(秒)、妥当性検査 TCPIPServerReceive 接続の詳細、メッセージ・コード化文字セットID、メッセージのエンコード、データ・レコード待機のタイムアウト(秒)、妥当性検査 18 ノードの構成可能プロパティー ノード名 構成可能プロパティー EmailOutput セキュリティーID、SMTPサーバおよびポート、妥当性検査 Compute データ・ソース、妥当性検査 Database データ・ソース DataUpdate データ・ソース DataInsert データ・ソース DataDelete データ・ソース DatabaseRetrieve データ・ソース名、妥当性検査 DatabaseRoute データ・ソース名、配布モード JavaCompute 妥当性検査 Mapping データ・ソース、妥当性検査 WareHouse データソース AggregateControl 集約名 AggregateReply 集約名 Collector コレクション有効期限 Filter データ・ソース ResetContentDescriptor 妥当性検査 Route 配布モード TimeoutControl 固有ID TimeoutNotification 固有ID、妥当性検査 Validate 妥当性検査 Trace ファイル・パス XSLTransformation スタイルシート名、スタイルシート・ディレクトリー 19 blank 20 <参考> メッセージ・フローのデプロイ 手順 ブローカー・アーカイブ・ファイルの作成 ②適切なプロジェクトを選択して右クリック. ポップアップ・メニューから「新規」→「MessageBrokerアーカイブ」を選択 ①「ブローカー・アプリケーション開発」 パースペクティブを選択 ③ブローカー・アーカイブ・ファイル名を入力して ③ファイル名を入力して「終了」 「終了」 21 メッセージ・フローのデプロイ 手順 メッセージ・フローの追加 (メッセージ・セットも同様の手順で追加) ①メッセージ・フローのデプロイに利用する ブローカー・アーカイブ・ファイルをダブル・クリック --> エディターが開く ②デプロイ対象のメッセージ・フローを選択して、 「ブローカー・アーカイブのビルド」をクリック 22 メッセージ・フローのデプロイ 手順 実行時属性の設定とデプロイ ④ブローカー・アーカイブ・ファイルを選択して右クリック. ポップアップ・メニューから「ファイルのデプロイ」を選択 ③「ブローカー管理」パースペクティブに移動 ②メッセージ・フローを選択して、実行時属性を設定 ⑤デプロイ先の実行グループを選択して 「OK」ボタンをクリック ①「構成」タブをクリック 23 メッセージ・フローのデプロイ 手順 デプロイ後の、ブローカー・アーカイブ・ファイルの再編集 「管理」タブでコンパイルされた、フロー定義、メッセージ定義を確認 ボタン1つで定義情報の更新/削除が可能 「ビルド」 → 「準備」タブでチェックされた開発物のビルド。修正した開発物の再読み込み&コンパイル。 「追加」 → 開発物を追加するため、「準備」タブに移動。 「除去」「編集」 → アーカイブ・ファイルに登録された開発物を除去、編集(コンパイルされたリソース名の変更など)。 24 主要なプロセス・ノード 外部インターフェースのサポート データ・フォーマット変換 コード変換 データベース・アクセス フロー制御 エラー処理 その他 25 主な提供機能 WMBでは様々な機能を標準提供 特定の処理を行う部品をプロセス・ノードとして提供 プロセス・ノードの実体は共有ライブラリ プロセス・ノードのプロパティをブローカー・ツールキットのGUI画面で定義することにより、 処理を実装 Webサービスを 呼び出すための部品 MQキューからメッセージを GETするための部品 出力メッセージを 生成するための部品 データベースアクセス するための部品 より柔軟な実装を可能にするために、開発言語もサポート ESQL Java 製品が標準提供しない機能を、ユーザーが独自開発することも可能 プラグイン・ノードとして開発 C言語とJavaでの開発が可能 26 外部インターフェースのサポート 多くの通信プロトコルをサポート その他のサポート通信プロトコル 各プロトコルに応じた入出力インターフェースを提供 サポート対象の主要な通信プロトコル MQ、JMS、HTTP/HTTPS、FTP*、TCPIP、SMTP*、 MQEveryplace、SCADA、JMS(IP) EIS*(SAP、People Soft、Siebel) サポート対象外の通信プロトコルにはアダプターで対応(プラグイン・ノードの開発など) 入力と出力で異なるプロトコルのノードを選択可能 ->プロトコル変換 * クライアント機能を提供 ファイル・アプリケーション メール・サーバー FTPサーバー SMTP FTP EISシステム SAP、Siebel、People Soft、 Oracle E-Commerce, JDEdwards) ブローカー EJBアプリケーション IIOP プラグイン (EJBクライアント) MQ JMS EJBアプリケーション (MDB) HTTPs Webサービス アプリケーション MQアプリケーション 27 外部インターフェースのサポート 多くのプロトコルをサポートし、多様な外部インターフェースを提供 外部インターフェース用のプロセス・ノード一覧 役割 外部インターフェース ノード名 説明 MQInput/MQOutput/MQReply/MQGet JMSInput/JMSOutput/JMSReply HTTPInput/HTTPReply/HTTPRequest SOAPInput/SOAPReply/SOAPRequest SOAPAsyncRequest/SOAPAsyncResponse MQとの入出力 JMSプロバイダーとの入出力 HTTPとの入出力 WebServiceとの入出力 FileInput/FileOutput TCPIPClientInput/TCPIPClientOutput/TCPIPCl ientReceive/TCPIPServerInput/TCPIPServerO utput/TCPIPServerReceive EmailOutput SCADAInput/SCADAOutput SAPInput/SAPRequest PeopleSoftInput/PeopleSoftRequest、 SiebelInput/SiebelRequest Publication Real-timeInput MQOptimaizeFlow、Real-TimeOptimizeFlow ファイルの入出力.FTP通信も可能(FTPクライアント機能) 28 ソケット通信との入出力 (クライアント機能とサーバー機能を提供) メールの出力(SMTP) SCADA端末との入出力 SAP、PeopleSoft、Siebelとの入出力 PubSub通信.MQ、MQEveryPlace、SCADA端末にメッセージ送信 JMS(IP)通信(入力) それぞれ、「MQInput + Publication」、「RealtimeInput + Publication」に相当 MQのサポート キューに対してMQPUT、MQGETを実行 MQGetノードではフロー処理の途中で、キューからメッセージを取得可能 キューに対してブラウズのみ実行することも可能 MQInputノードとMQGetノードでブラウズ機能を提供 キュー内のメッセージを削除せずに、メッセージのブラウズのみを実行 MQ関連の提供ノード一覧 役割 外部インターフェース ノード名 MQInput/MQOutput MQGet MQReply MQOptimaizeFlow、RealTimeOptimizeFlow メッセージ変換 MQHeader 説明 MQとの入出力 メッセージ・フローの途中でMQGET MQOutputのサブセット.MQMD.ReplyToQにメッセージ送信 それぞれ、「MQInput + Publication」、「RealtimeInput + Publication」に相当 MQヘッダーの生成/編集 29 MQInputノード キューからメッセージをMQGETし、メッセージ・フローの処理を開始 ※ -Failure -Out -Catch ※処理の実行結果に応じて、適切な出力端子からメッセージが出力される MQInputノードの例: Failure: 過度にバックアウトされているメッセージを出力 Out: ノードの処理が正常に終了したときにメッセージを出力 Catch: 後続ノードで例外が発生したときに、メッセージを出力 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 受信キュー名を指定 入力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など 拡張 トランザクション制御やID指定受信など、MQGETオプションを指定 妥当性検査 妥当性検査を実施する場合に設定 セキュリティー セキュリティー制御する場合に設定 インスタンス ノードレベルでインスタンス制御する場合に設定 30 MQOutputノード キューにメッセージをMQPUT -In -Failure -Out 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 「拡張」タブの「宛先モード」プロパティが「キュー名」の場合に、出力キュー名を指定 拡張 トランザクション制御やメッセージの出力方法など、MQPUTオプションを指定 「宛先モード」で出力先の指定方法を設定可能 ・キュー名: 「基本」タブで設定したキューに出力 ・宛先リスト: LocalEnvironmentツリーにセットされた宛先情報のキューに出力 ・キューへの応答:Root.MQMD.ReplyToQ、ReplyToQMgrにセットされた宛先情報のキューに出力 要求 リクエスト・メッセージを生成する場合に設定 妥当性検査 妥当性検査を実施する場合に設定 31 MQGetノード キューからメッセージをMQGETし、メッセージ・フローの処理を開始 ※ -In ※出力ターミナルの説明 Failure: 処理が失敗したメッセージを出力 Out: ノードの処理が正常に終了したときにメッセージを出力 警告: MQGETの完了コードが警告の場合に、メッセージを出力 メッセージなし: MQGETの理由コードが「MQRC_NO_MSG_AVAILABLE」の場合にメッセージを出力 -Failure -Out -警告 -メッセージなし 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 受信キュー名を指定 入力メッセージの構文解析 キューから受信したメッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など 拡張 トランザクション制御やGET_WAIT時間など、MQGETオプションを指定 LocalEnvironment.MQ.GETを使用して、ノードのプロパティ値の動的指定も可能 (ノードのプロパティで設定できないMQGMOの指定なども可能) MQGetノードで更新するメッセージ・ツリーの指定、入力ツリーの取り扱いの指定 要求 ID指定でのMQGETなどを行う際に設定 結果 MQGETの呼び出しの結果取得したメッセージ(結果ツリー)の処理方法を指定 「出力データのロケーション」: コピーした結果ツリーの挿入先を設定 「結果データのロケーション」: 結果ツリーから出力メッセージにコピーする部分を指定 ※デフォルトの設定では、結果ツリーをOutputRootにコピーするため、入力メッセージは削除される 妥当性検査 妥当性検査を実施する場合に設定 32 MQGetノード 出力メッセージ・ツリーの構成 入力ツリーとMQGETの呼び出し結果の結果ツリー(ResultRoot)を結合して構成 結合方法を「拡張」タブ、「結果」タブで指定 MQGetノードへの入力ツリー MQGET結果のResultツリー MQGETノードからの出力ツリー 33 MQGetノード MQGetノードで生成するメッセージ・ツリーの指定例 入力ツリーをそのまま出力 出力メッセージ・ツリーの更新箇所を指定 入力ツリーから出力メッセージにコピーするメッセージ部分、 LocalEnvironment部分を指定 【MQGetノードで生成された出力メッセージ・ツリー】 入力メッセージ・ ツリーからコピー ResultRootツリー内の「Status」エレメントを LocalEnvironmentツリーにセットして出力 コピー先を指定 ResultRootツリーの指定部分を LocalEnvironmentにコピー ResultRoot Properties コピーする部分を指定 MQMD MRM Status 34 MQGetノードで取得したメッセージ JMSのサポート JMSプロバイダーへの接続をサポート JMS 1.1の仕様に準拠する、任意のJMSプロバイダーをサポート JMSプロバイダーが提供するクラス・ファイル(JRE1.5のサポートが必要)を利用して接続 MQとJMSプロバイダーを中継する場合は、ヘッダーの変換が必要 JMSヘッダー<->MQヘッダー(MQMD)の変換ノードを提供 JMS宛先に対するメッセージ送信、受信を実行 JMS関連の提供ノード 役割 外部インターフェース メッセージ変換 ノード名 JMSInput/JMSOutput/JMSReply JMSMQTransform、MQJMSTransform JMSHeader 説明 JMSプロバイダーとの入出力 JMSメッセージとMQメッセージの変換 JMSヘッダーの生成/編集 JMSプロバイダー (MQ, WAS SIBUSなど) MQ JMSネットワーク MQネットワーク 35 JMSInputノード JMSプロバイダーに接続してJMSメッセージを受信し、メッセージ・フローの処理を開始 JMS1.1の仕様で定められた6種類全てのJMSメッセージの受信が可能 TextMessage, BytesMessage, StreamMessage, MapMessage, ObjectMessage, Message -Failure -Out -Catch 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 受信キュー名または、受信するトピック名を指定 JMS接続 JMSプロバイダーへの接続情報を設定 (初期コンテキスト・ファクトリー、JNDIバインディングの場所、接続ファクトリー、宛先情報など) 入力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など メッセージ選択 メッセージを選択受信する場合に設定 拡張 トランザクション制御やID指定受信など、MQGETオプションを指定 妥当性検査 妥当性検査を実施する場合に設定 36 JMSOutputノード JMSプロバイダーに接続し、JMSメッセージを送信 JMS1.1の仕様で定められた6種類全てのJMSメッセージの送信が可能 TextMessage, -In BytesMessage, StreamMessage, MapMessage, ObjectMessage, Message -Failure -Out 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 JNDI宛先キュー名または、送信するトピック名を指定 JMS接続 JMSプロバイダーへの接続情報を設定 (初期コンテキスト・ファクトリー、JNDIバインディングの場所、接続ファクトリーなど) 拡張 トランザクション制御やメッセージの出力方法など、MQPUTオプションを指定 妥当性検査 妥当性検査を実施する場合に設定 37 JMSのサポート JMSInputノードの設定例 JMSプロバイダー=WebSphere MQ JNDIネームスペース 宛先名 Q1 キュー名=Q1 トピック名 コネクション・ファクトリー JMSTEST QMgr名=JMSTEST JMSプロバイダーへの 接続情報 宛先名 38 Webサービスのサポート Webサービス・アプリケーションとの接続をサポート Webサービスに関連した標準規格に対応 WS-I Basic Profile 1.1 SOAP1.1/1.2、WSDL1.1、MTOM/XOP(*)、SOAP wtih Attachment XML1.0、XML1.1 HTTP1.0、HTTP1.1、HTTPs –POST/GETメソッド、KeepAliveセッション、ステータス・コード100シリーズ、チャンク転送コーディング JMS1.1 SOAP/JMS WS-Addressingへの対応 Webサービス・ リクエスター WS-Securityへの対応 Webサービス・ プロバイダー ブローカー SOAP/JMS Webサービス・ リクエスター SOAP/HTTP SOAP/HTTP Webサービス・ プロバイダー Webサービス関連の提供ノード 役割 外部インターフェース メッセージ変換 データベース・アクセス ノード名 説明 SOAPInput/SOAPReply/SOAPRequest Webサービスとの入出力 (同期呼び出し) SOAPAsyncRequest/SOAPAsyncResponse Webサービスとの入出力 (非同期呼び出し) HTTPInput/HTTPReply/HTTPRequest HTTPとの入出力 SOAPEnvelope/SOAPExtract SOAPエンベロープの分離/付与 HTTPHeader HTTPヘッダーの生成/編集 EndpointLookup/RegistryLookup WSRRに登録されたWSDLまたはサービス文書へのアクセス 39 Webサービスのサポート SOAPノードとHTTPノードの2種類を提供 SOAPノード HTTPプロトコルでWebサービス(SOAPメッセージ)の呼び出し/応答 HTTPノードの機能に加え、WS-AddressingやWS-Securityをサポート 実行グループ毎にHTTPリスナーがスレッドとして起動 SOAPノードを含むフローをデプロイすると、自動的にリスナーが起動(ポート番号:デフォルト7800~) 実行グループと同一プロセス内でHTTPリクエストを受信 ブローカー 実行グループ1 TCP/7800 listener Client SOAP/HTTP 実行グループ 2 TCP/7801 listener HTTPノード HTTPプロトコルで、Webサービス(SOAP)やWeb2.0アプリケーションの呼び出し/応答 SOAPに限定せずRESTやユーザ定義のメッセージ形式も扱うことができる HTTPノードはブローカー毎にbiphttplistenerプロセスがHTTPリスナーとして起動 HTTPリスナーとメッセージフローはMQメッセージで通信(内部キューを利用) ブローカー Client HTTP 40 実行グループ 3 TCP/7080 biphttplistener 実行グループ 4 SOAPInputノード SOAPメッセージを受信し、フロー処理を開始 SOAPReplyノードとセットで使用 サービスとして公開するURL名をHTTPトランスポートタブの「URLセレクター」で指定する WSDLの<soap:address>から自動的にセットされる -Failure -out -Catch WSDLファイルの指定は必須 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 WSDLのプロパティ情報を設定 関連付けるWSDL名を指定すると、WSDLの内容を元にその他の属性値を自動設定 ※指定するWSDLファイルは事前にメッセージセット内にインポートする HTTPトランスポート サービス・リクエストを受け付けるための、HTTPトランスポート関連のプロパティ値を設定 ( リクエストを受け付けるURLや最大クライアント待機時間など) 拡張 SOAPヘッダー関連の定義 WS拡張機能 WS-Addressing、WS-SecurityなどのWS拡張機能を使用する場合に設定 入力メッセージの構文解析 メッセージのパースに使用するメッセージ定義 (指定したWSDLファイルから自動的に設定される) ※「メッセージドメイン」は「SOAP」で固定 エラー処理 エラー発生時の動作を指定 妥当性検査 妥当性検査の有無 インスタンス ノードレベルでインスタンス制御する場合に設定 再試行 再試行のメカニズムを指定 41 SOAPInputノード SOAPInputノードの設定例 サービス・プロバイダーを作成する例 Webサービス・ リクエスター SOAP WSDLをドラッグ&ドロップすると、フローの自動生成ウィザード によりフローの雛形が作成される SOAPInputノードのプロパティもWSDLより、自動設定 ドラッグ&ドロップで生成される プロバイダー用フローの雛形 42 SOAPReplyノード メッセージツリーをSOAPメッセージに組み立て、リクエスターに応答を送信 SOAPInputノードで受信したSOAPメッセージの処理結果をレスポンスとして返却 SOAPInputノードとセットで使用 各ノードは別フローに配置することも可能だが、同一実行グループ内に配置することが必須 -Failure -out SOAP Webサービス・ リクエスター 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 妥当性検査 妥当性検査に関する設定 43 SOAPRequestノード 同期的にリモートのWebサービス呼び出し( HTTP通信)を実施 サービス・プロバイダーから応答が戻るまで、後続処理はWait リモートのWebサービスの非同期呼び出しに、SOAPAsyncRequestノードと SOAPAsyncResponseノードを提供 アクセス先URLは、HTTPトランスポートタブの「WebサービスURL」プロパティで指定する WSDLファイルの指定は必須 Webサービス・ SO ※Fault: サービス・プロバイダーからフォルトメッセージが 返された場合に出力 44 AP -Failure -Out -Fault ※ SO AP プロバイダー SOAPRequestノード 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 WSDLのプロパティ情報を設定 関連付けるWSDL名を指定すると、WSDLの内容を元にその他の属性値を自動設定 ※指定するWSDLファイルは事前にメッセージセット内にインポートする HTTPトランスポート 宛先サービスにリクエストを送信するための、HTTPトランスポート関連のプロパティ値を設定 ( 宛先URLやSSL構成、要求タイムアウト時間など) 拡張 SOAPヘッダー関連の定義 WS拡張機能 WS-Addressing、WS-SecurityなどのWS拡張機能を使用する場合に設定 応答メッセージの構文解析 応答メッセージのパースに使用するメッセージ定義 値は自動的に設定される ※「メッセージドメイン」は「SOAP」で固定 妥当性検査 妥当性検査の有無 45 HTTPInputノード HTTPメッセージを受信し、メッセージフローの処理を開始 HTTPReplyノードとセットで使用 サービスとして公開するURL名を基本タブの「URLのパス接尾部」で指定する RESTで使用するHTTPメソッドをサポート -Failure -out -Catch 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 サービス・リクエストを受け付けるための、HTTPトランスポート関連のプロパティ値を設定 ( リクエストを受け付けるURLやHTTPSの使用の有無など) 拡張 RouteToLabel / Labelノードと組み合わせて、 HTTPメソッドに応じた処理分岐を行う際に設定 (REST対応) 入力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など エラー処理 エラー発生時の動作を指定 妥当性検査 妥当性検査の有無 セキュリティー セキュリティーに関する設定(セキュリティー・プロファイル使用時) 46 HTTPReplyノード リクエスターに応答メッセージを送信 メッセージ・ツリーをビット・ストリームに組み立てて、HTTPリスナー経由でWebサービス・リクエス ターにレスポンスを送信 -Failure -out 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 トランスポート・エラーに対する設定 妥当性検査 妥当性検査に関する設定 47 HTTPRequestノード Webサービス呼び出しを実行(HTTP通信) メッセージ・ツリーをビットストリームに組み立ててリクエストを送信、レスポンスを待機 レスポンスの最大待機時間を設定可能(デフォルト120秒) 受信したレスポンスをメッセージ・ツリーにパースして後続ノードに渡す -Failure -Out -エラー ※ ※エラー: 100~299以外のステータス・コード時、メッセージを出力 「HTTP転送を使用」をチェックすれば、300番台(リダイレクション) は正しくハンドリング 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 宛先サービスにリクエストを送信するための、HTTPトランスポート関連のプロパティ値を設定 ( 宛先URLや要求タイムアウト時間など) HTTP設定 HTTPに関する設定 ( プロキシー・サーバー情報やHTTPのバージョン情報、HTTPリクエストメソッドなど) SSL SSLを使用する場合に設定 応答メッセージの構文解析 応答メッセージのパースに使用するメッセージ定義情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など エラー処理 エラー発生時の動作を指定 拡張 リクエスト・メッセージの生成に関する設定 妥当性検査 妥当性検査の有無 48 Webサービスのサポート WSRR(WebSphere Service Registry and Repository)との連携をサポート WSRRでサービスの定義情報を全社的に一元管理 WSRRから動的にサービス情報やサービス文書を取得して、ルーティングやフォーマット変換に利用 WSRRにアクセスしてサービスの定義情報を照会する2つのノードを提供 – EndpointLookup – RegitryLookup :WSRRに登録されたWSDLからWebサービスのエンドポイント情報を取得 例)HTTP通信の場合に、宛先サービスのURLを取得 :WSRRに登録されたサービス文書全体を取得 例)登録されたスタイル・シートを利用して、フォーマット変換ロジックをメッセージ・フローから排除 パフォーマンス向上のために、照会結果をキャッシュ可能 WebSphere Message Broker Webサービス・ リクエスター サービスA サービスB SOAP Request Endpoint Lookup SOAP Request WSRR 宛先情報や、登録文書をWSRRから取 得し、動的なルーティングやメディエーション 処理を行うことが可能 サービスA用 サービスB用 WSDL WSDL 49 blank 50 ファイル・インターフェースのサポート ファイルの読み込み、書き出しを実行 ローカルのファイルだけでなく、FTP経由でリモートのファイルにもアクセス可能 FTPクライアントの機能を提供 (FTPサーバーの機能は提供していない) ファイル全体を1レコードとして処理することも、指定したレコード単位に処理することも可能 ファイル関連の提供ノード 役割 外部インターフェース ノード名 説明 ファイルの入出力.FTP通信も可能(FTPクライアント機能) FileInput/FileOutput 51 FileInputノード 指定したディレクトリのファイルを検知し、読み込んで、フローを開始 フローの途中でファイルを読み込むことは不可 指定したディレクトリーを定期的にスキャンして、ファイルを検索 入力ファイルをレコード単位に処理することが可能 -Failure -Out -End of Data ※ -Catch ※End of Data: 後続処理を実装した場合、ファイル内の全てのレコードの処理完了後に End of Dataメッセージを出力 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 受信ファイルのディレクトリ名、ファイル名の指定 処理が正常終了した場合の入力ファイルの取り扱いを指定 (削除、またはサブディレクトリに移動のいずれかを選択) 入力メッセージの構文解析 メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など ポーリング ファイルの再検索間隔を指定 (デフォルト5秒) 再試行 処理が失敗した場合の再試行方法や、入力ファイルの取り扱いを指定 レコードおよびエレメント レコードの検出方法とそれに関する設定 固定長や区切り文字、メッセージ定義に応じたレコード検出 ファイル全体を1レコードとして扱うことも可能 妥当性検査 妥当性検査を実施する場合に設定 FTP FTPを使用する場合に設定 トランザクション 後続の処理に対するトランザクション制御の有無を指定 (FTPノードは制御外) インスタンス ノードレベルでインスタンス制御する場合に設定 52 FileOutputノード 指定したディレクトリにファイルを出力 複数レコードを1ファイルに出力可能 ファイル処理の終了通知をトリガーに、指定したディレクトリにファイルを作成 -Failure -Out -End of Data ※ -In ※ -Finish File ※Finish File: ファイル処理終了のトリガー・メッセージを受け取る End of Data: ファイルの終了処理成功時にFinish Fileターミナルで受信した メッセージを出力 主な設定プロパティ タブ 説明 説明 ノードの説明 基本 出力ファイルのディレクトリ名、ファイル名や、処理が正常終了した場合の出力ファイルの扱いを指定 要求 出力内容、ディレクトリー名、ファイル名に関する設定 レコードおよびエレメント ファイルへの出力方法を設定 処理メッセージを1レコードとして、そのまま追加、固定長データとしてPaddingして追加、区切り文字形式で 追加が可能 1レコードを1ファイルとして出力することも可能 妥当性検査 妥当性検査を実施する場合に設定 FTP FTPを使用する場合に設定 53 Fileのサポート FileInputノードの設定例 ファイルをレコード単位にMQメッセージに変換、送信する例 受信アプリケーション ①ファイルをレコード単位に処理 レコード・データ MQメッセージ MQGET_WAIT CTRL_Q DATA_Q CTRL_Qへの制御メッセー ジ到着を検知 LOOP ②ファイル処理の終了処理 処理の終了通知 CTRL_Q MQGET DATA_Q DATA_Qのレコード・データ を処理 : FileInputに指定したモニタリング・ディレクトリ C:¥TEST¥FILE File1 File2 ファイル処理の正常終了時は、処理した 入力ファイル名にタイムスタンプを追加して、 アーカイブディレクトリに保管 mqsiarchive mqsibackup 成功 File2 File1 ファイルをレコード単位に処理 「レコードの検出」でレコードの検出方法を 指定 (画面例:改行ごとに1レコードとして処理) 失敗 ファイル処理の結果に応じて、ファイルを削除または、 サブ・ディレクトリに移動することが可能 レコード単位に読み込んで、都度フローを 実行するため、レコード分のみメモリに展開 正常終了時 : アーカイブ用(mqsiarchive) エラー発生時: バックアップ用(mqsibackup) 54 Fileのサポート FileOutputノードの設定例 MQメッセージを一定の単位で1ファイルにまとめて出力する例 MQメッセージ ①1メッセージを1レコードとして ファイルに追記 ②最終メッセージが到着すると、 ファイルの終了処理を実施 (出力ディレクトリへのファイルの移動) FileOutputに指定した出力ディレクトリ C:¥TEST¥FILE 出力ディレクトリに同一名称のファイル が存在していた場合の対応を指定 (既存ファイルの置換、mqsiarchive ディレクトリへの移動など) mqsitransit File1 File1 File2 成功 レコード単位にファイルに出力 「レコードの定義」でレコードのファイル への追記方法を指定 (画面例:改行コード区切りでレコー ドをファイルに追記) レコードの追記中はサブディレクトリ(mqsitransit)に 出力データを保持 Finish Fileターミナルにファイル処理の終了通知を 受信すると、出力ディレクトリにファイルを作成 (1レコード1ファイルで出力する場合は、実装不要) 55 TCPIPのサポート 既存のソケット通信アプリケーションへの接続インターフェースの提供 データはノン・パーシステントで扱われ、トランザクション制御外となる クライアント用とサーバー用にそれぞれ、入出力インターフェースを提供 TCPIP関連の提供ノード一覧 役割 外部インターフェース ノード名 説明 TCPIPServerInput、TCPIPClientInput TCP/IP接続からデータを受信する TCPIPServerReceive、TCPIPClientReceive メッセージ・フローの途中でTCP/IP接続からデータを受信する TCPIPServerOutput、TCPIPClientOutput TCP/IP接続でデータを送信する 56 TCPIPのサポート 実行グループ内にTCPIP接続を確立するための接続マネージャーを内包 TCPIPノードデプロイ時に生成され、TCPIPノードが除去されると削除される TCPIP接続の生成や管理を実施 各TCPIPノードは接続マネージャーの内部プールから接続を取得 クライアントとサーバー 接続の確立方法が異なる(データの流れは関係ない) クライアント側の接続マネージャーからTCP/IPの接続要求を行い、サーバー側の接続マネージャーによって 受け入れられる 接続確立後はクライアントもサーバーも同じ操作、データの送受信が可能 プロパティの設定内容もほぼ同じ TCP/IPクライアント 実行グループ TCP/IPサーバー サーバ接続 マネージャー クライアント接続 マネージャー 実行グループ 接続要求(ポートを指定) 接続OK ポートA ポートB 接続確立 Input Output Output Input 57 TCPIPのサポート クライアント接続マネージャー 起動するとクライアント接続を生成 実行グループごとに、コネクション・プールを持つ 最大/最小コネクション数を指定可能 起動すると最小接続数まで、クライアント接続を生成 サーバー接続マネージャー 起動すると接続要求のリッスンを開始し、接続要求を受け入れる 最大受け入れコネクション数を指定可能 最大コネクション数を超えると、接続要求を拒否 1つのサーバーポートに複数のクライアントから接続可能 特定のポートをリッスンするサーバーノードは一時点で1実行グループにのみ配置可能 コネクションには“利用可能(Available)”と“予約済み(Reserved)”がある 予約することで、ソケット識別IDを元に同一コネクションを使用したデータのやり取りが可能 この制御は「拡張」タブの「ストリーム制御オプション」で指定 58 TCPIPInputノード TCPIP接続からデータを受信し、フロー処理を開始 複数のTCPIP接続からの送信データを1つのInputノードで処理可能 TCPIPClientInputノード TCPIPサーバーに接続要求を出し、クライアント接続を確立後、データを受信 -Failure -Out -Close ※ -Catch TCPIPServerInputノード TCPIPクライアントからの接続要求を受け入れ、サーバー接続を確立後、データを受信 -Failure -Out -Close ※ -Catch ※Close: コネクションが切断された際にメッセージを出力 59 TCPIPInputノード 主な設定プロパティ(Client・Server共通) タブ 説明 説明 ノードの説明 基本 ホスト名、ポート番号などの接続情報、およびデータ待機のタイムアウト値を指定 タイムアウト発生時はFailureターミナルより出力 (デフォルト60秒) 拡張 コネクションを切断するタイミング、入出力ストリームの扱いを指定 コネクションの予約の制御 入力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など レコードおよびエレメント レコードの検出方法とそれに関する設定 (ストリームの終わり、固定長、区切り文字、メッセージ定義に応じたレコード検出) 再試行 処理が失敗した場合の再試行方法を指定 妥当性検査 妥当性検査を実施する場合に設定 トランザクション 後続の処理に対するトランザクション制御の有無を指定 (TCPIPノードは制御外) インスタンス ノードレベルでインスタンス制御する場合に設定 60 TCPIPOutputノード TCPIPソケットを利用して、データを送信 TCPIPClientOutputノード クライアント接続を確立し、データを送信 -In ※1 -Close -Failure -Out -Close ※2 TCPIPServerOutputノード サーバー接続を確立し、データを送信 -In ※1 -Close -Failure -Out -Close ※2 ※1 Close:使用中のコネクションがクローズされた際に メッセージを受け取る ※2 Close:Close入力端子で受け取ったメッセージを出力 61 TCPIPOutputノード 主な設定プロパティ(Client・Server共通) タブ 説明 説明 ノードの説明 基本 ホスト名、ポート番号などの接続情報、およびデータ送信のタイムアウト値を指定 タイムアウト発生時はFailureターミナルより出力 (デフォルト60秒 / -1は無期限にWait) 拡張 データの送信先、コネクションを切断するタイミング、入出力ストリームの扱いなどを指定 要求 出力データ部やホスト名やポート名などの動的指定に関する設定が可能 レコードおよびエレメント 出力データの取り扱いを設定 (そのまま出力、固定長、区切り文字) 妥当性検査 妥当性検査を実施する場合に設定 62 TCPIPReceiveノード TCPIP接続からのデータを受信待機し、データ受信後に後続のフロー処理を開始 TCPIPOutputノードと組み合わせると同期的な連携を実現 IDを指定して、同一コネクションでデータを送受信 TCPIPClientReceiveノード -In -Failure -Out -Timeout ※ TCPIPServerReceiveノード -In -Failure -Out -Timeout ※ ※ Timeout:受信データ待ちのタイムアウトが発生したときに メッセージを出力 63 TCPIPReceiveノード 主な設定プロパティ(Client・Server共通) タブ 説明 説明 ノードの説明 基本 ホスト名、ポート番号などの接続情報、およびデータ待機のタイムアウト値を指定 タイムアウト発生時はFailureターミナルより出力 (デフォルト60秒 / -1は無期限にWait) 拡張 コネクションを切断するタイミング、入出力ストリームの扱いを指定 要求 ホスト名やポート名などの動的指定に関する設定が可能 結果 受信した応答結果を格納するメッセージ・ツリー宛先を設定 入力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など レコードおよびエレメント レコードの検出方法とそれに関する設定 (接続のクローズ、固定長、区切り文字、メッセージ定義に応じたレコード検出) 妥当性検査 妥当性検査を実施する場合に設定 64 TCPIPのサポート TCPIPServerInputノードの設定例 TCPIP要求 WorkshopInfo,WMB△ フロー処理 TCPIP応答 WMB,v6.0.2,20081002 「レコードおよびエレメント」で、入力ストリー ムの終端の識別方法を指定 例:スペースでストリームの終端を識別 「基本」タブで、サーバーの リッスンポートを指定 「拡張」タブで接続クローズや入出力ストリームの扱いを指定 65 その他プロトコルのサポート SMTPサーバーとの接続をサポート SMTPサーバーに接続し、電子メールを送信 フロー処理結果に応じたメール通知などが可能 -Failure -Out 役割 ノード名 外部インターフェース 説明 メールの出力(SMTP) EmailOutput EISサーバーとの接続をサポート 主要なEIS(Enterprise Information System)システムとの接続をサポート 提供されるWebSphere Adaptersノード SAP、Siebel、PeopleSoft 各EISシステムごとに受信用(Input)ノードと送信用(Request)ノードを提供 WebSphere Adaptersのテクノロジーを使用 JCA Framework 1.5に準拠 役割 外部インターフェース ノード名 SAPInput/SAPRequest PeopleSoftInput/PeopleSoftRequest SiebelInput/SiebelRequest 説明 SAPとの入出力 PeopleSoftとの入出力 Siebelとの入出力 66 データ・フォーマット変換 多くのデータ・フォーマットをサポート カスタム・ワイヤー・フォーマット(CWF:Custom Wire Format) CやCOBOLアプリケーションなどが扱う構造体イメージのデータ MQ太郎 千葉市美浜区中瀬1-1 19780726 ・・・ タグ・区切り文字フォーマット(TDS: Tagged Delimited String) SWIFT、EDIFACTなどの業界標準が採用.CSV(Comma Separated Values)もTDSの一種 NAME:MQ太郎*ADDRESS:千葉市美浜区中瀬1-1*BirthDay:1978||・・・ XML XML1.0、XML1.1をサポート.ネームスペース付XML、SOAPにも対応 <Customer><Name>MQ太郎</Name><Adress>千葉市美浜区・・・ その他 MIME(SOAP with Attatchmentを含む)、JMSMap、JMSStream、SAP IDoc、バイナリをサポート 67 データ・フォーマット変換 宛先システムに合わせた、データ・フォーマット変換が可能 物理フォーマット種別の変換、論理メッセージの変換が可能 物理フォーマット種別の変換: 論理メッセージの変換: CWF、TDS、XMLなどの変更 エレメント追加/削除/並べ替えや、エレメント値の変更 ブローカーは、物理メッセージ <-> 論理メッセージの変換を自動で行う データ受信時に、メッセージ定義に従ってデータから物理表現を削除し、ツリー構造の論理メッセージに変換 (パース) データ出力時に、メッセージ定義に従って論理メッセージに物理表現を付与(組み立て) -> メッセージ・フローで論理メッセージを組み替えるだけで、論理メッセージの変換が可能 MQ太郎 千葉市美浜区中瀬1-1 <Customer><Name>MQ太郎</Name><Adress>千葉市美浜区・・・ パース:物理表現の削除 フィールドの追加/削除/値の変更/並び替え Root Properties ヘッダー MessageSet MessageType メッセージ・ツリー(論理メッセージ) 68 (Domain) Customer Name Address 19780726 ・・・ 組み立て:物理表現の付与 データ・フォーマット変換 データ・フォーマット変換用のプロセス・ノード一覧 変換ロジックの実装方法によって、適切なノードを選択 役割 メッセージ変換 ノード名 説明 Compute ESQLによる変換、データベース・アクセス JavaCompute Javaによる変換 Mapping GUIマッピングによる変換、データベース・アクセス XSLTransform XSLTによる変換 SOAPEnvelope/SOAPExtract SOAPエンベロープの分離/付与 JMSMQTransform、MQJMSTransform MQHeader、JMSHeader、HTTPHeader JMSメッセージとMQメッセージの変換 各種プロトコルのヘッダーの生成/編集 69 Computeノード ESQLを使用したデータ・フォーマット変換の実装 メッセージ・ツリーの更新 メッセージ・ツリー(Root)を更新可能なノードは、Computeノードのみ Environment、LocalEnvironment、ExceptionListツリーの更新はDatabase、Filterノードでも可能 メッセージ・ツリーへのアクセス Compute Database Filter 更新はプロパティの設定が必要 参照のみ 参照のみ ○ ○ ○ 更新はプロパティの設定が必要 ○ ○ 更新はプロパティの設定必要 ○ ○ Environmentツリーのアクセス LocalEnvironmentツリーへのアクセス ExceptionListツリーへのアクセス -In ※ Out、Out1~4: ESQLモジュールのRETURN(TRUE)により、Outからメッセージ が出力される(RETURN FALSE|UNKNOWNはメッセージ消失). PROPAGATEで出力ターミナルを指定すると、該当ターミナル にメッセージ出力 -Failure -Out、Out1~4 ※ 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 ESQLモジュール:ノードで行う処理を記述したESQLモジュールの名前 データソース:DB処理を行う場合は、アクセスするデータベース名やトランザクション制御の有無を設定 計算モード:メッセージ・ツリーの更新処理を行う場合は、後続ノードに出力するメッセージを設定 パーサー・オプション XMLNSCパーサー・オプションの指定 妥当性検査 妥当性検査の有無 70 Computeノード Computeノードの計算モード Computeノードは、入力されたRoot、LocalEnvironment、ExceptionListツリーの更新を禁止 別途、出力用にRoot、LocalEnvironment、ExceptionListツリーを作成 後続ノードに入力ツリー、出力ツリーのどちらを渡すかを制御するのが「計算モード」 出力ツリーを渡すものを選択 メッセージ(Root)、LocalEnvironment、Exceptionの組み合わせ(7通り)から選択 入力 InputRoot InputLocalEnvironment InputExceptionList 出力 OutputRoot OutputLocalEnvironment OutputExceptionList ・計算モードがデフォルトの「メッセージ」だと、LocalEnvironemntツリーに対する更新は無効 ・LocalEnvironmentツリーの更新などはDatabaseノードの方が容易 71 Computeノード データ・フォーマット変換のロジックはESQLで実装 ESQLモジュールはプロセス・ノードと紐付けられた処理の実行単位 Computeノードのプロパティに呼び出すモジュール名を指定 実装方法の詳細は後述 「ESQLモジュール」属性で指定した モジュールのMain()関数が実行される. 72 Mappingノード GUIエディターを使用したデータ・フォーマット変換の実装 メッセージ・マッピング・エディターを使用し、変換ロジックをグラフィカルに実装 出力メッセージのエレメントに、入力メッセージのエレメントや計算式をマッピング <メッセージ・フロー名><ノード名>.msgmapという名前のファイルの中で定義 -In -Failure -Out メッセージのBody部だけでなく、ヘッダー部のマッピングも可能 LocalEnvironment メッセージのProperties メッセージ・ヘッダー (MQヘッダー、HTTPヘッダー、JMSヘッダーなど) データベース列とのマッピングも可能 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 マッピング・ルーチン:ノードで行う処理を記述したマッピング・ルーチンの名前 データソース:DB処理を行う場合は、アクセスするデータベース名やトランザクション制御の有無を設定 マッピングモード:メッセージ・ツリーの更新処理を行う場合は、後続ノードに出力するメッセージを設定 パーサー・オプション XMLNSCパーサー・オプションの指定 妥当性検査 妥当性検査の有無 73 Mappingノード メッセージ・マッピング・エディタ 出力メッセージのエレメントに、入力メッセージのエレメントをGUIを使用してセット if文やfor文などのマッピング・ロジックを使用してマッピングの制御が可能 固定値や計算値も設定可能 マップ済みのエレメントが線で結ばれる 簡単なマッピングならエレメントをドラッグ&ドロップするだけ 「ソース」ペイン($source) ソース・メッセージやデータベース表を表示 「編集」ペイン ターゲット・エレメントへの割り当てる値の計算式 ESQL関数、Xpath関数なども使用可能 「スクリプト・エディター」 マッピングの実行条件(if)、 繰り返し処理(for)などのロジックを編集 74 「ターゲット」ペイン($target) ターゲットのメッセージを表示 エレメントのマッピング 選択によるマッピング 「ソースからのマップ」またはドラッグ&ドロップでのマッピング 単一エレメントのマッピングも、構造全体(子エレメントも含む)のマッピングも可能 – 構造全体のマッピングを行うには、ソース・エレメントとターゲット・エレメントが同じ構造である必要がある マッピングする単一エレメント同士を接続 名前によるマッピング 「名前でマップ」で複合タイプをマッピング – ソース・エレメントとターゲット・エレメントの名前が一致するものをマップ 同類の名前を持つエレメントがマッピングされる リーフのマップ: ソース・エレメントの下位エレメントと、ターゲット・エレメントの下位エレメントをマップ 直接の子のマップ: ソース・エレメントの直接の子と、ターゲット・エレメントの直接の子をマップ 同じ名前の項目のみマップ: 同じ名前の項目が結び付けられる。(大文字と小文字の区別はなし) 類似する名前の項目のマップ: 同類の名前の項目が結び付けられる 75 ターゲット・エレメント値の計算 ターゲットとなるエレメントの「編集」ペインに関数や式を記述 固定値の設定 ターゲット・エレメントに直接、固定値を指定 「編集」ペインに必要な定数を直接入力 以下の事前定義関数を使用可能 ESQL (esql:) (fn:) マッピング (msgmap:) スキーマ・キャスト (xs:) XPath 演算式を使用した記述 例)入力メッセージのPriorityプロパティーに1加算 $source/Properties/Priority + 1 XPath関数を使用して記述 接頭辞に「fn:」を指定してXPath関数を記述 例)ブランクを挟んで”Airline/Customer/FirstName”と”Airline/Customer/LastName”を連結 fn:concat($source/Airline/Customer/FirstName, ' ', source/Airline/Customer/LastName) ESQL関数を使用して記述 接頭辞に「esql:」を指定してESQL関数を記述 例)入力メッセージのReplyIdentifierプロパティーを大文字にする esql:upper($source/Properties/ReplyIdentifier) 76 JavaComputeノード Javaを使用したデータ・フォーマット変換の実装 メッセージ・ツリーにアクセスするためのJavaクラスを提供 DOMに似た構文でメッセージ・ツリーにアクセス XPathでのアクセスもサポート XPathはread-onlyの照会言語.出力用メッセージを操作(エレメントの作成・変更)するための構文を 追加 JavaComputeノードは3種類のクラス・テンプレートを提供 メッセージの変更用、メッセージの作成用、メッセージのフィルタリング用 フローをbarファイルに追加する際に、Javaコードも自動的にbarファイルにパッケージ -In -Failure -Out -Alternate ※ ※ Alternate: ノードの処理が正常終了したときに、Outターミナルの代わり 指定可能なメッセージの出力先 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 ノードで行う処理を記述したJavaクラス名を指定 パーサー・オプション XMLNSCパーサー・オプションの指定 妥当性検査 妥当性検査の有無 77 JavaComputeノード メッセージ・ツリー内のエレメントへのアクセス方法 MbMessageAssembly ノード間でやりとりするメッセージ・ツリーの最上位層 4つのメッセージ・オブジェクトを含む –Message、Local Environment、Global Environment、Exception List MbElement メッセージ・ツリー内の各エレメント –ツリーの最上位部から下位層に向かい、必要なエレメントに達するまで関連する親子関係をたどる [A] Root MbMessage inMessage = inAssembly.getMessage(); (1) [A] MbElement inRoot = inMessage.getRootElement(); [B] MbElement inxml = inRoot.getLastChild(); [C] MbElement indoc = inxml.getFirstChild(); [D] MbElement inChap = indoc.getFirstChild(); [E] (2) (5) Properties (5) (5) (3) (4) [B] (3) (4) MQMD XMLNSC [C] (1) getFirstChild() (2) getLastChile() (3) getNextSibling() (4) getPreviousSibling() (5) getParent() MbElement inTitle = inChap.getNextSibling(); 78 (1) (5) (2) document (1) (2) (5) (5) [D] [E] Chapter (3) (4) Title JavaComputeノード Javaを使用したデータ・フォーマット変換の実装 <データ・フォーマット変換の実装例> フォーマット変換の ユーザーロジックを追加 79 XSLTノード スタイル・シートを使用したデータ・フォーマット変換の実施 スタイル・シートで変換する場合は、入力データ、出力データともにXMLであることが条件 コンパイル済みスタイル・シートをキャッシュして高速にXMLデータを変換 -In -Failure -Out <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xalan="http://xml.apache.org/xslt"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <xsl:value-of select="message"/> </xsl:template> </xsl:stylesheet> スタイルシートの例 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 スタイルシート スタイル・シートの指定 出力メッセージの構文解析 受信メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など 妥当性検査 妥当性検査の有無 詳細トレース XSLTransformノードのアクションをトレースする場合に設定 (デフォルト:Off) 80 コード変換 宛先システムに合わせたコード変換が可能 データ部のコード・ページ(CCSID)をMQMD.CodedCharSetIdに設定するのがMQのルール データ部の文字フィールドのエンコーディングを指定 MQMD.CodeCharSetId MQMD Root.MQMD.CodedCharSetIdの書き換えで、文字フィールドのコード変換が行われる メッセージ・ツリーのコード・ページはUNICODE(UTF-16) –MQメッセージをパースするとき、文字フィールドをMQMD.CodedCharSetId->UTF-16にコード変換 –MQメッセージを組み立てるとき、文字フィールドをUTF-16->MQMD.CodedCharSetIdにコード変換 Root 数値フィールドのエンコーディング変換も同様 Root.MQMD.Encodingを変換ターゲット値に設定 UTF-16 S-JIS(943) EBCDIC(5026) SET OutputRoot.MQMD.CodedCharSetId = 5026; 81 コード変換 WMBで使用するコード変換のカスタマイズが可能 WMBは内部的にICU(International Components for Unicode) v3.2を使用 以下の2通りのコード変換のカスタマイズが可能 (1) コード変換テーブルをカスタマイズ –外字エリアのマッピングを独自にカスタマイズするなど (2) マッピング・テーブルのカスタマイズ –CCSID943<->UNICODEで使用される変換テーブルをICUのデフォルトから変更 ICUのサイトより雛形となる変換テーブルやマッピング・テーブルをダウンロードして、カスタマイズ 変換テーブルやマッピング・テーブルをカスタマイズするためのツールをICUで提供 参考. ICU関連ツールの入手先 http://icu.sourceforge.net/download/ ICU ユーザーガイド http://icu.sourceforge.net/userguide/icudata.html 82 コード変換テーブルのカスタマイズ <参考> 1. ICU関連ツールをダウンロード ICU3.2「Source Code Download」と「Binary Distribution Download」をダウンロード http://icu.sourceforge.net/download/ 例: icu4c-3.2.1.zip、icu-3.2-Win32-msvc7.1.zipをダウンロード 2.ダウンロードしたファイルの解凍とPATHの設定 解凍して作成されたファイルのbinディレクトリのパスを環境変数Pathに設定する 例: set Path=%Path%;C:¥temp¥icu¥bin <http://icu.sourceforge.net/download/> 83 コード変換テーブルのカスタマイズ <参考> 1.マッピング・データ・ファイル(.ucm)のコピーとファイル名の変更 雛形にするマッピング・データ・ファイルをコピーし、ファイル名を「ibm-number.ucm」のネーミングに変更 –C:¥tmp¥icu-3.2-Win32-msvc7.1¥icu¥source¥data¥mappings¥xxxx.ucmに マッピング・データ・ファイルが提供されている –numberは既存のサポート・コード・ページで使用されていない、一意の番号に設定 –以下のURLで既に使用されている番号を確認可能 http://publib.boulder.ibm.com/infocenter/ wmbhelp/v6r0m0/index.jsp?topic=/com.ibm.etools.mft.doc/ac00408_.htm 例: copy ibm-943_p130-1999_ucm ibm-948.ucm 2. マッピング・データ・ファイルのヘッダー部を修正 <code_set_name>にファイル名と同じ値を設定 例:<code_set_name> "ibm-948" 84 コード変換テーブルのカスタマイズ <参考> 3.マッピング・データ・ファイルの修正 例:文字「星」、「円」、「音」を「☆」、「¥」 、「♪」に置き換えるよう、マッピング・データ・ファイルを修正 星 円 音 ☆ ¥ ♪ 943 90AF 897E 89B9 8199 818F 81F4 UTF-16 661F 5186 97F3 2606 FFE5 266A (以下、ibm-948.ucmより、該当する記述を抜粋) 修正前 <U2606> : <U266A> : <U5186> : <U661F> : <U97F3> : <UFFE5> UNICODE 修正後 ¥x81¥x99 |0 ☆ ¥x81¥xF4 |0 ♪ ¥x89¥x7E |0 円 ¥x90¥xAF |0 星 ¥x89¥xB9 |0 音 ¥x81¥x8F |0 ¥ <U2606> : <U266A> : <U5186> : <U661F> : <U97F3> : <UFFE5> ¥x81¥x99 |0 ☆ ¥x81¥xF4 |0 ♪ ¥x81¥x8F |1 円 → ¥ ¥x81¥x99 |1 星 → ☆ ¥x81¥xF4 |1 音 → ♪ ¥x81¥x8F |0 ¥ SJISで入力された「星」「円」「音」をUTF-16の「☆」「¥」「♪」に 対応するコードとマッピング SJIS(hex) サポートする変換の向き 0: 相互 1: UNICODE->xxx 3: xxx->UNICODE 85 コード変換テーブルのカスタマイズ <参考> 4.作成したマッピング・データ・ファイル(.ucm)をバイナリに(.cnv)に変換 makeconv -p ICUDATA maping_file.ucm 例: makeconv –p ICUDATA ibm-948.ucm (icudt32l_ibm-948.cnvが生成される) icudt32<platform-suffix>_<mapping_file>.cnv – の名前でファイルが作成される <platform-suffix> l : リトル・エンディアン ASCII プラットフォーム b: ビッグ・エンディアン ASCIIプラットフォーム e: EBCDICプラットフォーム 5.作成された.cnvファイルをブローカーがアクセス可能なディレクトリにコピー 例:Win環境ではC:¥MessageBroker¥6.0¥sample¥converters以下に配置 UNIXでは/var/mqsi/convertersなど 6.ブローカーに.cnvファイルの格納ディレクトリを設定 mqsicreatebrokerまたはmqsichangebrokerの-cオプションで指定 例:mqsichangebroker TESTBK -c C:¥MessageBroker¥6.0¥sample¥converters .cnvファイルの格納ディレクトリはICU_DATA環境変数でも設定可能 86 マッピング・テーブルのカスタマイズ <参考> 1. マッピング・テーブルの編集 C:¥tmp¥icu-3.2-Win32-msvc7.1¥icu¥source¥data¥mappings¥convrtrs.txtファイルをコピーして編集 例: CCSID=943が使用するコード変換テーブルを、作成したコード変換テーブルibm-948.cnvに設定 ibm-xxxがCCSIDxxxに対応 修正内容 ibm-943_P15A-2003 { UTR22* } ibm-943 # Leave untagged because this isn't the default Shift_JIS { IANA* MIME* WINDOWS JAVA } : ibm-943_P130-1999のibm-943のエントリーはコメントアウト ibm-943_P130-1999 { UTR22* } # ibm-943 { IBM* JAVA } Shift_JIS # Leave untagged because this isn't the default cp943 { JAVA* } # This is slightly different, but the backslash mapping is the same. : ibm-948 { UTR22* } ibm-943 { IBM* JAVA} cp943a { JAVA* } CCSID=943として使用するucmファイルのエントリーに{IBM* JAVA}タグをつける Javaのデフォルト・エイリアスも1つ用意する必要がある 87 マッピング・テーブルのカスタマイズ <参考> 2. 作成したマッピング・テーブル・ファイル(.txt)をバイナリに(.icu)に変換 gencnval 例: gencnval (cnvalias.icuが生成される) 3.作成されたcnvalias.icuファイルの名前をicudt32l_cnvalias.icuに変更し、 ブローカーがアクセス可能なディレクトリにコピー 例:Win環境ではC:¥MessageBroker¥6.0¥sample¥converters以下に配置 UNIXでは/var/mqsi/convertersなど 4. ICUにicudt32l_cnvalias.icuファイルの格納ディレクトリを設定 ICU_DATA環境変数を利用 WMB/Winでは、ブローカーはサービスとして起動されるため、 ICU_DATA環境変数はシステム環境変数として設定 88 データベース・アクセス メッセージ・フローからデータベースの参照・更新が可能 データベースの照会結果をメッセージに埋め込んでルーティング ブローカー経由で配信したメッセージからデータ・ウェアハウスを構築 データベースへのアクセスに3つの方法を提供 ESQL、GUIマッピング、Java ESQLはODBC、JavaはJDBCでデータベースに接続 GUIマッピングはノードにより、ODBCまたはJDBCでデータベースに接続 ストアード・プロシージャーの呼び出しにも対応 サポート対象のデータベース: DB2、Oracle、Sybase、SQL Server、Informix 89 データベース・アクセス データベース・アクセス用のプロセス・ノード一覧 DBアクセス・ロジックの実装方法によって、適切なノードを選択 データベース・ アクセス 役割 ESQL Java GUI ノード名 Database Compute Filter JavaCompute Mapping DatabaseRoute DatabaseRetrieve DataDelete/DataInsert/DataU pdate/Warehouse 説明 ESQLによるデータベース・アクセス Javaによるデータベース・アクセス GUIマッピングによるデータベース・アクセス GUIマッピングによるデータベース・アクセス データベースの照会結果を元にルーティング処理を実施 GUIマッピングによるデータベース・アクセス データベースの照会結果をメッセージ・ツリーにセット GUIマッピングによるデータベース・アクセス (互換性のために違う名前で残されているだけで、処理内容はMappingと同等) 90 Database / Compute / Filterノード ESQLを使用したデータベース・アクセスの実装 Databaseノード、Computeノード、Filterノードが使用可能 データベース処理のロジックはESQLで実装 ESQLモジュールはプロセス・ノードと紐付けられた処理の実行単位 ノードのプロパティに呼び出すモジュール名や、アクセスするデータベース名を指定 実装方法の詳細は後述 -In -Failure -Out、Out1~4 ※ ※ Out、Out1~4: ESQLモジュールのRETURN(TRUE)により、Outからメッセージ が出力される(RETURN FALSE|UNKNOWNはメッセージ消失). PROPAGATEで出力ターミナルを指定すると、該当ターミナル にメッセージ出力 <Databaseノードでのデータ更新の例> CREATE DATABASE MODULE DBAccess_Sample_Database CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN NSERT INTO Database.ORDER VALUES(Body.XML.ELE1, Body.XML.ELE2, Body.XML.ELE3); RETURN TRUE; END; END MODULE; 入力メッセージの内容をデータベースにInsert 91 Mappingノード GUIエディターを使用したデータベース・アクセスの実装 Mapping / DatabaseDelete / DataInsert / DataUpdate / Warehouse ノード 事前にデータベースの接続定義の作成が必要 「ファイル」→「新規」→「データベース接続」を選択し、定義ウィザードで接続するデータベース情報を登録 データベース・エクスプローラで、ツールキットからデータベースに接続してテーブルの定義情報を取得可能 <Mappingノードでのデータの削除の例> 操作対象のテーブル 削除対象レコードの条件 (SQLのWHERE文節) ドラッグ&ドロップ データベースに接続し、操作対象の テーブルの定義情報を取得 92 JavaComputeノード Javaを使用したデータベース・アクセスの実装 主に以下の方法でDBアクセスが可能 JDBC Type4ドライバーを使用してJDBC接続 ESQLを使用してODBC接続(MbSQLStatement) JDBC Type4ドライバーでの接続 ブローカーのJava API、getJDBCType4Connectionを使用して接続を開始 –第一引数には、登録したJDBCプロバイダー・サービス名を指定 DBへの接続後は標準のJDBC APIを使用してSQL操作が可能 事前にJDBC接続環境のセットアップが必要 –mqsicreateconfigurableserviceコマンドでデータベースにアクセスするためのJDBCプロバイダー・サービスを登録 <JavaComputeノードでのデータベース参照例> Connection conn = getJDBCType4Connection("DB2",JDBC_TransactionType.MB_TRANSACTION_AUTO); 入力メッセージの内容をSelect Statement stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet srs0 = stmt.executeQuery("SELECT CODE, COMPANY FROM GOODS_TBL"); 93 blank 94 フロー制御 条件に応じたフローの処理分岐や実行制御が可能 フロー制御用のプロセス・ノード一覧 役割 ノード名 処理の分岐 Filter フロー制御 実行タイミングの制御 説明 ESQLによる条件判断で処理を分岐 RouteToLabel/Label Labelノードに処理を移動/処理の移動先 Route XPATH式による条件判断で処理を分岐 DatabaseRoute データベースの照会結果に対して、XPATH式による条件 判断で処理を分岐 AggregateControl/ AggregateRequest/AggregateReply Aggregator機能 (複数宛先への要求送信、応答メッセージを待ち受けて 合体) Collector 複数のメッセージを待ち受けて、1のメッセージに集約 TimeoutControl、TimeoutNotification メッセージ・フローのスケジュール実行 FlowOrder 分岐フローの実行順序制御 95 Filterノード ESQLを使用した条件分岐の実装 Filterノード、Computeノード、Databaseノードが使用可能 FilterノードはRETURNステートメントで出力ターミナルを選択 DatabaseノードやComputeノードはPROPAGATEステートメントで出力ターミナルを指定し、処理分岐 の実装が可能 ESQLモジュールはプロセス・ノードと紐付けられた処理の実行単位 ノードのプロパティに呼び出すモジュール名を指定 実装方法の詳細は後述 -In -Failure -Unknown ※ -False -True ※ Unknown、False、True: ノードの処理が正常に終了したとき、メッセージを出力. ESQLモジュールのRETURN(TRUE|FALSE|UNNKOWN)により、出力ターミナルが選択される. CREATE FILTER MODULE Filter_Sample_Filter CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN IF Body.ELE1 = 'SYSTEM1' THEN RETURN TRUE; ELSEIF Body.ELE1 = 'SYSTEM2' THEN RETURN FALSE; ELSE RETURN UNKNOWN; END IF; <Filterノードでの分岐処理の例> RETURN TRUE; END; END MODULE; 96 RouteToLabelノード / Labelノード 動的ルーティングや多数の処理分岐パターンに対応可能 RouteToLavelノードからLabelノードへ処理を移動(goto文) Labelノードは同一メッセージ・フロー内になければならない メッセージの内容によって処理の分岐を行う 移動先のラベル名をLocalEnvironmentに設定 RouteToLavelノードはLocalEnvironmentのラベル名を参照して処理を移動 DatabaseノードのESQL例 IF xxxxxxx THEN SET LocalEnvironment.Destination.RouterList.DestinationData.Label = (ラベル名) END-IF; Labelノードに設定したラベル名を指定 : 97 RouteToLabelノード / Labelノード 多段ルーティング LocalEnvironmentに移動先のラベル名を複数設定して、多段ルーティングが可能 移動先のラベル名を配列で設定 RouteToLabelノードの「モード」でラベル名の配列のアクセス順序を指定 –「最初へ経路指定」 配列の先頭のラベル名に処理を移動 –「最後へ経路指定」 配列の最後のラベル名に処理を移動 移動後、配列の該当ラベル名を削除 ラベル名を配列にして指定 SET OutputLocalEnvironment.Destination.RouterList.DestinationData[1].labelname = (ラベル名) SET OutputLocalEnvironment.Destination.RouterList.DestinationData[2].labelname = (ラベル名) 98 Aggregationノード 1つの要求メッセージを複数宛先に送信し、複数の応答メッセージを1つに集約して処理 することが可能 予約サービスを並行に実行 ホテル予約サービス 旅行予約業務 3種類のノードでフローを構成 ブローカー AggregateControlノード 飛行機予約サービス 要求メッセージのFan-Outの開始を指定するノード AggregateRequestノード Fan-Outフローで使用し、送信した要求メッセージの情報を記録するノード AggregateReplyノード Fan-Inフローで応答メッセージの集約の終了を指定するノード 要求メッセージ送信 Fan-Outフロー サーバー・アプリケーション クライアント・アプリケーション 要求メッセージ送信 Fan-Inフロー 応答メッセージ受信 99 Aggregationノード AggregateControlとAggregateReplyノードで同一の「集約名」を指定 Fan-OutフローとFan-Inフローを紐付ける Fan-Outフローの設定 MQOutputノードでプロパティ「新規メッセージID」にチェック 応答メッセージとの紐付けのため、新規にメッセージIDを割り振る AggregateRequestノードで「フォルダー名」をセット 応答メッセージはここで指定したフォルダー名のツリーにセットされる サーバー・アプリケーションの実装 要求メッセージのメッセージIDを応答メッセージの相関IDにコピー 要求メッセージと応答メッセージの紐付けのため 100 サーバー・アプリケーション Aggregationノード Fan-Inフローの設定 応答メッセージツリー 各メッセージはComIbmAggregateReplyBodyフォルダーに格納される 各サーバー・アプリケーションからの応答メッセージはAggregateRequestノードで指定した名前のフォル ダーに格納 Fan-OutフローのAggregateRequestノード Fan-Inフローで集約した応答メッセージ そのままのフォーマットではキューに出力できないため、Computeノードでの編集が必要 101 blank 102 Collectorノード N:1のデータグラム通信 複数のメッセージ到着を待ちうけ、1つのメッセージに集約してルーティング Collectorノードの入力ターミナルは追加可能。任意の数のシステムからのメッセージをマージ可能 異なるプロトコルから入力されたメッセージも集約可能 システム1 -Control ブローカー -Failure -Out -Expire -Catch システムA システム2 システムN 集約したメッセージ 「Out」ターミナルの先にはComputeノードかJavaComputeノードを接続 他のノードではCollectorノードから出力されたメッセージ・ツリーを扱えない Root Properties CollectionName Collection 入力ターミナル名 入力ターミナル名 - Root.Collection配下に入力ターミナル名 のフォルダが作成され、入力メッセージが展 開される。 Properties MQMD MRM Properties MQMD MRM 入力ターミナルを追加可能(任意の数) 103 Collectorノード 様々な集約条件(メッセージが揃ったと判断する条件)を指定可能 プロパティ「基本」タブの「コレクションの定義」で、メッセージを集約するためのルールを指定 入力ターミナルごとに定義 ターミナル名 入力ターミナルを追加すると自動設定 Collectionツリーのフォルダー名としても使用される 数量 1つのCollectionに含めるメッセージ件数 タイムアウト メッセージを受け付けるためのタイムアウト値(秒) 相関パス 集約するメッセージを紐付けるためのキーを含むエレメント・パス 相関パターン 指定したパスの値からキーワードを抜き出すための条件 コントロール・メッセージにより、集約したメッセージの出力のタイミングをコントロールすることも可能 コントロール・メッセージがControlターミナルで受信されたタイミングで、集約メッセージを出力 コントロール・メッセージの内容は無視され、破棄される 後続ノードにメッセージを流すタイミングの設定 キーを使って関連するメッセージを集約する (同一キー値のメッセージを集約する) in1にメッセージが1つ届く in1はmsg1.elm01フィールドを利用.*.txtの*の部分をキー値に採用 AND in2はmsg2.elm02フィールドを利用.*.datの*の部分をキー値に採用 in2にメッセージが3つ届く、OR、10秒間後続メッセージが届かない (メッセージが1つも届かないときは条件を満たさない) 104 Timerノード メッセージ・フローのタイマー実行 外部からのイベント(メッセージの入力など)なしに、タイマー起動でメッセージ・フローを実行 一定間隔で自動で実行 開始時間や実行回数を制御して実行 2つのノードを提供 TimeoutControlノード -In -Failure -Out TimeoutNotificationノードを制御するためのノード TimeoutNotificationノード メッセージ・フローを実行するノード 単体で使用することも、TimeoutControlから制御されて使用することも可能 -Failure -Out -Catch TimeoutNotificationノードの出力メッセージ・ツリー 一定間隔でフローを実行するなど単体で使用する場合 ノードからは「Properties」フォルダだけが含まれたメッセージが出力される (0バイトメッセージ) TimeoutControlノードから制御して使用する場合 TimeoutControlノードからメッセージ全体または一部を引き継ぐことが可能 (デフォルトでメッセージ全体を引き継ぐ) タイムアウト要求メッセージをLocalEnvironmentまたはメッセージの一部に組み込んで送信 105 Timerノード TimeoutControlからTimeoutNotificationを制御する場合の実装 対になるTimeoutControl、TimeoutNotificationノードに同じ固有IDを付与して関連づける TimeoutNotificationノードの動作モードを「制御」に設定 タイムアウト要求メッセージを作成してTimeoutNotificationノードに送信する Rootツリー (タイムアウト要求メッセージ) タイムアウト 情報 Rootツリー 同じ名前の固有IDを設定して関連付ける 動作モードを「制御」に設定する 106 Timerノード タイムアウト要求メッセージのフォーマット タイムアウト要求メッセージは以下のパラメーターを使用して構成 XML形式の他にもパーサーがサポートしている他の任意の形式を使用する事ができる <TimeoutRequest> <Action>SET | CANCEL</Action> <Identifier>String (any alphanumeric string)</Identifier> <StartDate>String (TODAY | yyyy-mm-dd)</StartDate> <StartTime>String (NOW | hh:mm:ss)</StartTime> <Interval>Integer (seconds)</Interval> <Count>Integer (greater than 0 or -1)</Count> <IgnoreMissed>TRUE | FALSE</IgnoreMissed> <AllowOverwrite>TRUE | FALSE</AllowOverwrite> </TimeoutRequest> パラメーター 設定内容 Action タイムアウト要求の処理(SET | CANCEL)を指定 (必須) Identifier タイムアウト要求を識別するIDを指定 (必須) StartDate 開始日時を”TODAY”もしくはyyyy-mm-ddの形式で指定 StartTime 開始時刻を”NOW”もしくはhh:mm:ssの形式で指定 Interval 実行間隔(秒)を指定 Count 実行回数を0より大きい整数か-1で指定.-1を指定した場合は無制限に実行 IgnoreMissed ブローカーが停止しているときに発生したタイムアウト・イベントの扱い 無視するか/ブローカー起動後にすぐにイベントを生成するかの設定 AllowOverwrite 同じIdentifierのタイムアウト要求がきた場合に、このタイムアウト要求を上書きできるかどうか 107 blank 108 ESQL解説 109 ESQLの開発 WMBが提供するスクリプト言語 SQLをベースに、メッセージ・ツリーとデータベースの両方の操作を行えるように拡張 プロセス・ノードと紐付けられた処理の実行単位 Computeノード、Databaseノード、Filterノードで使用可能 各ノードのプロパティに呼び出すモジュール名を指定 <メッセージ・フロー名>.esqlという名前のESQLファイルの中で定義 「ESQLモジュール」属性で指定した モジュールのMain()関数が実行される. 110 ESQLの例 Computeノードが自動で生成するESQL CREATE COMPUTE MODULE msgflow01_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- CALL CopyMessageHeaders(); -- CALL CopyEntireMessage(); RETURN TRUE; END; CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; CREATE xxx MODULE ~ END MODULE; ・プロセス・ノードと結び付けられる処理単位 ・モジュール名をノードの属性に指定 CREATE FUNCTION() RETURNS xxx ・関数の定義 ・Main()はモジュールが呼び出されたとき、 最初に実行される(エントリ・ポイント) ・RETURN xxxで値を戻して関数を抜ける BEGIN ~ END; ・ブロック(単一のステートメントとして扱われる) ・関数やプロシージャーの本体の記述に使用 -・一行のコメント ・範囲のコメントは/* */ CALL xxx ・プロシージャーの呼び出し CREATE PROCEDURE() ・プロシージャーの定義 ・関数とプロシージャーに違いは戻り値の有無 DECLARE xxx ・変数の宣言 WHILE xxx DO ~ END WHILE; ・繰り返し END MODULE; 111 SET xxx = xxx ・値の割り当て ESQL文法 ステートメント ステートメント 特定のキーワードで始まり、セミコロン(;)で終了する実行文 主なステートメント 変数の宣言 SET 値の割り当て IF ~ END IF 分岐処理 WHILE ~ END WHILE 繰り返し処理 DECLARE ステートメント例 DECLARE I, J INTEGER; SET I = 1; SET J = 1; WHILE I < 100 DO IF MOD(I, 2) = 0 THEN SET J = J + 1; END IF; SET I = I + 1; END WHILE; MOD:剰余演算を行う関数 112 ESQL文法 ステートメント ステートメントの一覧 基本 DECLARE、SET、BEGIN~END、IF、CASE、WHILE、LOOP、REPEAT、ITERATE、LEAVE、 CREATE MODULE、CREATE FUNCTION、CALL、 CREATE PROCEDURE、RETURN メッセージ・ツリー操作 CREATE FIELD、DELETE FIELD、 ATTATCH、 DETACH、MOVE、FOR データベース更新 DELETE、INSERT、UPDATE、 PASSTHRU ※ データベース参照のSELECTはステートメントでなく、関数 ノード対話 PROPAGATE 例外操作 DECLARE HANDLER、THROW、RESIGNAL その他 EVAL、BROKER SCHEMA、LOG 113 ESQL文法 変数・定数 変数・定数 変数の型(データ型) 数値 文字 ブール 日時 ツリー参照 論理ツリー INTEGER、DECIMAL、FLOAT BIT、BLOB、CHARACTER BOOLEAN DATE、TIME、TIMESTAMP、GMTTIME、GMTTIMESTAMP、INTERVAL REFERENCE ROW (ESQLでは配列変数は提供されない.論理ツリー変数が配列構造のデータも保存) 宣言例 DECLARE I, J INTEGER; DECLARE value DECIMAL 12.345; DECLARE CONSTANT string CHARCTER ‘hello world!!’; DECLARE ref REFERENCE TO InputBody.FLD01; 複数の変数を同時に宣言可能 変数を宣言時に初期化可能 CONSTANTキーワードで定数の宣言が可能 参照変数は宣言時に初期化が必要 114 ESQL文法 変数・定数 <参考> データ型 種別 数値 文字 データ型 説明 INTEGER 整数 -9223372036854775808 ~ 9223372036854775807 DECIMAL 整数部/小数部合わせて31桁までの数値、小数点の位取りは可変 FLOAT 64ビットの指数近似値 BIT 可変長バイナリ BLOB バイト単位の可変長バイナリ (B’1010100010010’) (X’F9A123B5’) CHARACTER 可変長ストリング ブール BOOLEAN ブール値 (TRUE、FALSE、UNKNOWN) (‘漢字ひらがな’) 日時 DATE 日付 (DATE ‘yyyy-mm-dd’) TIME 時間 (TIME ‘hh:mm:ss.ffffff’) TIMESTAMP 日時 (TIMESTAMP ‘yyyy-mm-dd hh:mm:ss.ffffff’) GMTTIME グリニッジ標準時間 (GMTTIME ‘hh:mm:ss.ffffff’) GMTTIMESTAMP グリニッジ標準日時 (GMTTIMESTAMP ‘yyyy-mm-dd hh:mm:ss.ffffff’) INTERVAL インターバル 参照 REFERENCE メッセージ・ツリーへのポインタ (例.1年と6ヶ月前 論理ツリー ROW 任意のデータをツリー構造で保存 INTERVAL ‘-1 06’ YEAR TO MONTH ) ()内はリテラル 115 ESQL文法 変数・定数 変数・定数のスコープ プロシージャー変数、定数 関数、プロシージャー内で宣言された変数、定数 変数、定数を宣言した関数、プロシージャー内でのみ有効 モジュール変数、定数 モジュール・レベルで宣言された変数、定数 モジュール内のすべての関数、プロシージャーで有効 CREATE COMPUTE MODULE msgflow01_Compute DECLARE mod_var INTEGER 1; /* モジュール変数 : */ CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE sub_var; /* プロシージャー変数 */ SET sub_var = sub_ver + 1; : END; END MODULE; 116 ESQL文法 演算子・式 演算子・式 演算子 算術演算子 比較演算子 論理演算子 +、-、*、/、|| >、<、>=、<=、=、<>、BETWEEN、IN、LIKE、IS、EXISTS、SINGULAR NOT、AND、OR 算術演算例 SET value = 1 - (a * B) / c + 12.6; SET interval = (curr_date – DATE ’2002-01-01’) DAY; SET string = ’Hello ’|| ’world!!’; +、-で日時の演算が可能 ||はストリングの連結 117 ESQL文法 演算子・式 <参考> 比較演算例、論理演算例 A1 <= 2 (B1 = 1 AND B2 <> 10) OR B1 >= 10 /* 結果はTRUE */ ‘hello’ = ‘hello ‘ (C1 BETWEEN 1 AND 10) OR (C2 BETWEEN ASYNMETRIC 10 AND 1) D1 IN (1, 6, 4, 10) E1 IS NULL AND E1 IS NUMBER F1 LIKE ‘IBM_’ OR F2 LIKE ‘IBM%’ EXISTS(SELECT * FROM ・・・) A1 NOT <= 2 AND D1 NOT IN(1, 6, 4, 10) AND E1 IS NOT NULL 文字列の比較ではトレーラーのブランクは無視される BETWEENはエンドポイントの間に値があることを検査 ASYNMETRICキーワードを使用すると、2つのエンド・ポイントの指定順序はどちらでもよい INは指定されたいずれかの値であることを検査 ISはNULL値の検査 TRUE、FALSE、UNKNOWのブール値との比較、数値であるか(NUMBER)の検査も可能 LIKEは特定のパターンにマッチするかを検査 _ 任意の1文字の代替 % 任意の数(ゼロを含む)の文字の代替 EXSITSはSELECTが1つ以上の結果を戻したかを検査 いずれの演算子もNOTと併用可能 118 ESQL文法 制御文 分岐処理 IF ~ END IF IF value_1 = 0 THEN SET size = 'small'; ELSEIF value_2 = 1 THEN SET size = ‘large'; ELSE SET size = ‘medium'; END IF; CASE ~ END CASE <単純CASE文> <検索CASE文> CASE WHEN size = ‘small’ THEN SET description = 'small'; WHEN size = ‘medium’ THEN SET description = 'medium'; WHEN size = ‘large’ THEN SET description = 'large'; ELSE SET description = 'unkown'; END CASE; CASE size WHEN ‘small’ THEN SET description = 'small'; WHEN ‘medium’ THEN SET description = 'medium'; WHEN ‘large’ THEN SET description = 'large'; ELSE SET description = 'unkown'; END CASE; TRUEになった箇所を実行したらCASE文は終了(C言語のようにbreak文相当は必要ない) 119 ESQL文法 制御文 繰り返し処理 WHILE ~ END WHILE WHILE counter <= 3 DO SET SUM = SUM + value; SET counter = counter + 1; END WHILE; label1 : WHILE counter <= 3 DO IF cond = TRUE THEN LEAVE label1; END IF; SET SUM = SUM + value SET counter = counter + 1; END WHILE label1; ラベルが付けられたWHILEでは、LEAVEやITERLATEステートメントを使用可能 LEAVE ITERATE 残りの処理をスキップし、繰り返し処理を抜ける(C言語のbreak文) 残りの処理をスキップし、次の繰り返し処理に入る(C言語のcontinue文) 下記も繰り返し処理用の制御文 LOOP ~ END LOOP、REPEAT ~ END REPEAT、FOR ~ END FOR 120 ESQL文法 関数 関数 文字列処理関数 LEFT、LENGTH、LOWER(LCASE)、LTRIM、OVERLAY、POSITION、REPLACE、REPLICATE RIGHT、RTRIM、SPACE、SUBSTRING、TRANSLATE、TRIM、UPPER(UCASE) 数値処理関数 ABS(ABSVAL)、ACOS、ASIN、ATAN、ATAN2、BITAND、BITNOT、BITOR、BITXOR、 CEIL(CEILING)、COS、COSH、COT、DEGREES、EXP、FLOOR、LN(LOG)、LOG10、MOD、POWER、 RADIANS、RAND、ROUND、SIGN、SIN、SINH、SQRT、TAN、TANH、TRUNCATE 日時関数 EXTRACT、CURRENT_DATE、CURRENT_TIME、CURRENT_TIMESTAMP、CURRENT_GMTDATE、 CURRENT_GMTTIME、CURRENT_GMTTIMESTAMP、LOCAL_TIMEZONE フィールド処理関数 ASBITSTREAM、FIELDNAME、FIELDNAMESPACE、FIELDTYPE、FIELDVALUE、FOR、LASTMOVE、 SAMEFIELD SQL状態関数 SQLCODE、SQLERRORTEXT、SQLNATIVEERROR、SQLSTATE リスト関数 CARDINALITY、EXISTS、SINGULAR、THE 複合関数 CASE、CAST、SELECT、ROW、LIST 各種関数 COALESCE、NULLIF、PASSTHRU、UUIDASBLOB、UUIDASCHAR 121 ESQL文法 関数 <参考> 動作を誤解しやすい関数 CURRENT_TIMESTAMP 現在のタイムスタンプを取得 SET curr_time1 = CURRENT_TIMESTAMP; : SET curr_time2 = CURRENT_TIMESTAMP; /* 結果はTRUE */ IF (curr_time2 – curr_time1) SECOND = INTERVAL ‘0’ SECOND THEN 同一ノード内ではCURRENT_xxxxは同じ値を返却 CAST データ型の変換 SET str0 = CAST(CAST(12.34 AS DECIMAL (8, 3)) AS CHARACTER); /* 結果は’00012.340’ */ SET str1 = CAST(X’68656C6C6F’ AS CHARACTER); /* 結果は’X’68656C6C6F’’ */ SET str2 = CAST(X’68656C6C6F’ AS CHARACTER CCSID 943); /* 結果は’hello’ */ SET bin1 = CAST(’hello’ AS BLOB); /* 例外が発生 */ SET bin2 = CAST(’hello’ AS BLOB CCSID 943); /* 結果はX’68656C6C6F’ 明示的なCASTが必要になるケースは少ない(暗黙的なCASTが実行されるため) CHARACTER<->BLOBの変換ではCCSIDの指定が可能 バイナリ・フィールドのMQMD.CorrelIdにセットされている文字列を読みたいときに使用するなど 122 ESQL文法 プロシージャー ユーザー定義関数 CREATE FUNCTION func_name(parm_list) RETURNS data_type BEGIN ~ END; CREATE FUNCTION CalcValues(value1 INTEGER, value2 INTEGER) RETURNS INTEGER BEGIN DECLARE TEMP INTEGER; SET TEMP = value1 * 2 + value2; RETURN TEMP; END; 関数はRETURN文で1つの値を返して終了 次ページのプロシージャーと同様、parm_listにIN、OUT、INOUTの キー・ワードを使用可能(オプション) 関数の呼び出し DECLARE I INTEGER; SET I = CalcValues(1, 5); 123 ESQL文法 プロシージャー ユーザー定義プロシージャー CREATE PROCEDURE proc_name(parm_list) [RETURNS data_type] BEGIN ~ END; CREATE PROCEDURE CalcValues(IN Value1 INTEGER, INOUT Value2 INTEGER) BEGIN SET Value2 = value1 * 2 + value2; END; プロシージャーではRETURNSはオプション扱い parm_listにIN、OUT、INOUTのキー・ワードが必要 IN OUT INOUT 入力パラメータ 出力パラメータ 入出力パラメータ プロシージャーの呼び出し DECLARE I INTEGER 5; CALL CalcValues(1, I); 戻り値のないプロシージャー の呼び出しにはCALLを使用 (戻り値がある場合は、関数と同様の呼び出し) 124 ESQL文法 外部プロシージャー 外部プロシージャー呼び出しも可能 データベース・ストアード・プロシージャー LANGUAGE DATABASE – CREATE PROCEDURE proc_name(parm_list) [RETURNS data_type] LANGUAGE DATABASE [DYNAMIC RESULT SETS integer] EXTERNAL NAME routine_name; CREATE PROCEDURE get_data(IN value1 INTEGER, IN value2 INTEGER) RETURNS INTEGER LANGUAGE DATABASE DYNAMIC RESULT SETS 2 EXTERNAL NAME DB_PROC; DATABASE でデータベース・ストアード・プロシージャーの呼び出しを宣言 EXTERNAL NAMEにプロシージャー名を設定 結果セットを受けとるときは、結果セット数をDYNAMIC RESULT SETSに指定 LANGUAGE プロシージャーの呼び出し DECLARE I INTEGER; DECLARE set1, set2 ROW; SET I = get_data(1, 5, set1.data[], set2.data[]); 戻り値のないプロシージャー の呼び出しにはCALLを使用 (戻り値がある場合は、関数と同様の呼び出し) 結果セットを受け取る変数は、引数として渡す.論理メッセージ・ツリー、ROW変数を指定 (配列[]での指定が必要) Javaプロシージャー LANGUAGE JAVA 125 blank 126 ESQL文法 エレメントへのアクセス(基本) エレメントへのアクセス ツリーの上部から下方に向かって、エレメントの親子関係をたどる 相関名から開始して、エレメント名をドット(.)で区切る Root.MQMD.Priority Root.MRM.message.data1 Environment.Variables.”user err no” スペースやドットを含むエレメント名は、ダブル・クォーテーション(“)で囲んで参照 相関名 Computeノードは入力と出力のツリーを区別し、Input・Outputのプレフィックスが付く –Environmentツリーは例外.Input・Outputの区別なし –OutputBodyの相関名はない ノード 使用可能な相関名 Database、Filter ・Root、 Environment、LocalEnvironment、ExceptionList ・Properties、Body、DestinationList Compute ・InputRoot、OutputRoot、 Environment、InputLocalEnvironment、OutputLocalEnvironment 、 InputExceptionList、OutputExceptionList ・InputProperties、OutputProperties、 InputBody、InputDestinasionList、OutputDestinationList Properties、Bodyは、それぞれ、Root.Properties、Root.(ドメイン名)の省略 DestinatinListはLocalEnvironmentと同じ(互換性のために残されているだけ) OutputBodyの相関名はない 127 ESQL文法 エレメントへのアクセス(基本) 繰り返しエレメント(配列)へのアクセス 配列はエレメント名[n] (n: 1~LAST)を使用してアクセス 該当エレメントの検索方法(先頭から検索/後尾から検索)を指定可能 – > 先頭から検索 、< 後尾から検索 – > nで先頭からn番目のエレメント、< nで後尾からn番目のエレメント (Domain) Body.Order.Items[15] Body.Order.Items[>] Order /* Body.OrderItems[1]と同じ */ Body.Order.Items[<] /* Body.Orderの最後のエレメント */ Body.Order.Items[> 2] /* 先頭から2番目のエレメント Body.Order.Items[< a+2] /* 最後からa+2番目のエレメント */ */ Order No Items[1] Item Code Quantity Items[2] Item Code Quantity 配列の個数はCARDINALITY関数で取得可能 SET count = CARDINALITY(Body.Order.Items[]); 配列であることを明示するため、[]をつけること 128 データ・フォーマットの変換 メッセージの変換 入力メッセージ・ツリーを参照するなどして、出力用のメッセージ・ツリーを組み立てる 出力時にパーサーがメッセージ・ツリーを物理メッセージに組み立てる ユーザー・データをドメイン名(パーサーの名前)のエレメントの子として作成 MRMドメインでは、さらに、メッセージ・セット、タイプ、フォーマットを Root.Properties.MessageSet、MessageType、MessageFormatに設定 Root.MQMD.CodedCharSetId、Encodingに 物理メッセージに組み立てるときのコード・ページ(CCSID)、エンコーディング値を設定 JMSStream XML メッセージ・ツリー(論理メッセージ) XMLNS MRM Domain JMSMap BLOB Root MQMD Properties (Domain) StrucId MessageSet Format MessageType Order Order No CodedCharSetId Encoding MessageFormat Items[1] Item Code Quantity 129 データ・フォーマットの変換 出力用のメッセージ・ツリーの組み立て方法は大きく2種類 入力メッセージ・ツリーからのコピーはヘッダー類だけ、 ユーザー・データは入力メッセージ・ツリーを参照しながら出力用のメッセージ・ツリーを組み立てる 入力メッセージ・ツリー全体を出力用のメッセージ・ツリーにコピー、 出力用のメッセージ・ツリーに更新操作(フィールドの追加/削除/並び替え/値の変更 )を行う ドメインの変更が伴わないメッセージ変換に制限 入力メッセージ・ツリー InputRoot Properties 出力メッセージ・ツリー CREATE COMPUTE MODULE msgflow01_Compute OutputRoot CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- CALL CopyMessageHeaders(); -- CALL CopyEntireMessage(); RETURN TRUE; END; Properties どちらかのコメントを外して使用 ・ESQLでメッセージの変換を行えるのはComputeノードだけ (Database、Filterノードでは不可) ・Computeノードは入力と出力のメッセージ・ツリーを区別 ヘッダー類のコピーだけ メッセージ全体をコピー CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; CREATE PROCEDURE CopyEntireMessage() BEGIN SET OutputRoot = InputRoot; END; END MODULE; 130 データ・フォーマットの変換 エレメントへの値の設定 SET /* 値の設定(エレメントがなければ作成) SET OutputRoot.MRM.Order.OrderNo = 123456; SET OutputRoot.MRM.Order.OrderNo = NULL; */ /* エレメントの削除(下位エレメントも同時に削除される) */ SET OutputRoot.MRM.Order.OrderNo NAME = ‘OrderNumber’; /* 既存エレメントの名前の変更 SET OutputRoot.MRM.Order.OrderNo VALUE = NULL; */ /* エレメント値にNULL値を設定 */ /* 上位エレメントをコピーすれば、下位エレメントもコピー */ SET OutputRoot = InputRoot; エレメントが既存なら値を更新 エレメントがなければエレメントを作成して値を設定 既存のエレメントを削除するときは、NULLを設定 NAMEキーワードを使用して、既存エレメントの名前を変更 エレメントの値をNULL値に設定するときは、VALUEキーワードを使用 上位エレメントをコピーすると、下位エレメントも自動的にコピーされる 131 データ・フォーマットの変換 データ・フォーマット変換ESQL CREATE COMPUTE MODULE msgflow01_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); SET OutputRoot.Properties.MessageSet = ‘MSGSET01’; SET OutputRoot.Properties.MessageType = ‘MSG01’; SET OutputRoot.Properties.MessageFormat = ‘CWF’; SET OutputRoot.MRM.Order.OrderNo = InputBody.Order.OrderNo; DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputBody.Order.Items[]); WHILE I <= J DO SET OutputRoot.MRM.Order.Items[>I].”Item Code” = InputBody.Order.Items[>I].”Item Code”; SET OutputRoot.MRM.Order.Items[>I].”Item Name” = ‘Thinkpad T60’; : SET I = I + 1; END WHILE; RETURN TRUE; END; : (Domain) ドメインをMRMに変更 Order Item Nameの追加 Order No Items[1] Item Code Quantity 132 ESQL文法 様々なエレメントへのアクセス方法 無名アクセス エレメント名を明示的に示さず(’*’で代替し)、配列に見立ててアクセス CREATE PROCEDURE CopyMessageHeaders() BEGIN DECLARE I INTEGER; DECLARE J INTEGER; SET I = 1; SET J = CARDINALITY(InputRoot.*[]); WHILE I < J DO SET OutputRoot.*[I] = InputRoot.*[I]; SET I = I + 1; END WHILE; END; Root Properties Root.*[1] MQMD MRM Root.*[2] Root.*[3] 133 ESQL文法 様々なエレメントへのアクセス方法 エレメント名の解決 エレメント名を変数などから解決.演算式を{}内に記述 DECLARE number CHARACTER ‘01’; Body.data.{’Customer-’ || number}.invoice; 134 ESQL文法 様々なエレメントへのアクセス方法 REFERENCE変数での動的参照 MOVEで参照を移動し(下記キーワードで移動方向を指定)、メッセージ・ツリーをナビゲーション PARENT、PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、LASTCHILD MOVE TOで特定のエレメントへの移動も可能 PARENT /* REFRENCE変数の宣言*/ DECLARE ref REFERENCE TO Body; PREVIOUSSIBLING /* メッセージ・ツリーのナビゲーション*/ MOVE ref FIRSTCHILD; current FIRSTCHILD MOVE ref NEXTSIBLING NAME ‘FIELD01’; NEXTSIBLING LASTCHILD MOVE ref TO Body.OrderNo; /* ナビゲーションの成否の検査 (該当エレメントがないとFALSE) */ IF LASTMOVE(ref) = FALSE THEN /* エレメント名の検査 */ IF FIELDNAME(ref) = ‘OrderNo’ THEN /* エレメントの値 */ IF FIELDVALUE(ref) = X’FFFF’ THEN REFRENCE変数は宣言時に初期化が必須 PARENT以外では、NAMEキーワードを併用可能.ナビゲーション先を特定の名前をもつエレメントに限定 ナビゲーション(最後のMOVE関数)の成否はLASTMOVE関数で検査可能 (エレメントがなく、ナビゲーションに失敗するすればFALSEが返る) FIELDNAME関数で該当エレメントの名前を検査 FIELDVALUE関数で該当エレメントの値を取得 繰り返し項目へのアクセスには、動的参照を使うとパフォーマンスがよい 135 ESQL文法 様々なエレメントへのアクセス方法 エレメントの作成 NAME、VALUEのキーワードを使用して、エレメントを作成 作成位置の指定方法は2種類 FIELD : 子エレメントを作成 (CREATE LASTCHILD OFと同等) CREATE xxx OF: 特定のエレメントからの相対位置関係で指定 (PARENTのキーワードは不可) –PREVIOUSSIBLING、NEXTSIBLING、FIRSTCHILD、LASTCHILD CREATE CREATE FIELD OutputRoot.XMLNSC.Order NAME ’OrderNo’ VALUE 123; CREATE LASTCHILD OF OutputRoot.XMLNSC.Order NAME ’OrderNo’ VALUE 123; CREATE NEXTSIBLING OF ref1 NAME ’OrderNo’ VALUE 123; /* 下記も正しい文法 */ CREATE FIELD OutputRoot.XMLNSC.Order; エレメント作成位置のツリーは自動的に作成される.下記のように3つのESQLを書く必要はない CREATE OutputRoot.XML; CREATE OutputRoot.XML.Order; CREATE FIELD OutputRoot.XML.Order NAME ’OrderNo’ VALUE 123; NAME、VALUEキーワードなしのCREATE FIELDも可 エレメントの削除 DELETE FIELD :特定のエレメントを削除、DELETE xxx OF:相対位置のエレメントを削除 DELETE FIELD OutputRoot.XMLNSC.Order.OrderNo; DELETE LASTCHILD OF OutputRoot.XMLNSC.Order; DELETE NEXTSIBLING OF ref1; 136 ESQL文法 様々なエレメントへのアクセス方法 エレメントのカット&ペースト DETACHでエレメントを切り離し、ATTACHで取り付け MOVE ref1 TO OutpuRoot.XMLNSC.data.Item[1]; DETACH ref1; ATTACH ref1 TO OutputRoot.XMLNSC.data AS LASTCHILD; DETACHの引数は、REFERENCE変数に限定 DETACH、ATTACHできるのは変更可能なツリーに限定(InputRootなどは不可) 137 ESQL文法 様々なエレメントへのアクセス方法 メッセージ変換ESQL(動的参照) (Domain) ドメインをMRMに変更 Order CREATE COMPUTE MODULE msgflow01_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN CALL CopyMessageHeaders(); Item Nameの追加 Order No Items[1] Item Code Quantity SET OutputRoot.Properties.MessageSet = ‘MSGSET01’; SET OutputRoot.Properties.MessageType = ‘MSG01’; SET OutputRoot.Properties.MessageFormat = ‘CWF’; SET OutputRoot.MRM.Order.OrderNo = InputBody.Order.OrderNo; DECLARE o_msg REFERENCE TO OutputRoot.MRM.Order; DECLARE i_msg REFERENCE TO InputBody.Order.Items[>]; WHILE LASTMOVE(i_msg) = TRUE DO CREATE LASTCHILD OF o_msg NAME ‘Items’; CREATE LASTCHILD OF o_msg.Items[<] NAME ‘Item Code’ VALUE i_msg.”Item Code”; CREATE LASTCHILD OF o_msg.Items[<] NAME ‘Item Name’ VALUE ‘Thinkpad T23’; : MOVE i_msg NEXTSIBLING; END WHILE; RETURN TRUE; END; : 138 データベース・アクセス データベース・アクセス Databaseノード、Computeノード、Filterノードでデータベース・アクセスするESQLを実装可能 アクセスするデータベースの名前(DSN)をノードの「データ・ソース」プロパティに設定 データベース・アクセスの方法は大きく2種類 ESQLが提供するデータベース・アクセス関数の利用 –データベースのSQL文とほとんど同等の構文、データベースがサポートしていないいくつかの有用な構文が実行可能 PASSTHRUの利用 –データベースに直接SQLを発行.ESQLでの構文チェックはないため、データベースがサポートする構文をすべて実行可能 データベース・エラーで例外を発生させずに、エラーをESQLでハンドリングすることも可能 「データベース・エラーで例外をスロー」のチェックを外す 4つのデータベース状態標識(ESQL関数)でエラーを検査 –SQLCODE、SQLSTATE、SQLNATIVEERROR、SQLERRORTEXT 139 データベース・アクセス ESQLでのデータベース・アクセス INSERT/UPDATE/DELETE/SELECT INSERT INTO Database.TABLE01 VALUES(Body.FLD01, Body.FLD02); UPDATE Database.TABLE01 AS T SET T.COL2 = 1 WHERE T.COL1 = Body.FLD01; DELETE FROM Database.TABLE01 AS T WHERE T.COL1 = Body.FLD01; DECLARE data ROW; SET data.RECORD[] = SELECT T.* FROM TABLE01 AS T WHERE T.COL01 = Body.FLD01; 構文は、通常のSQLと同等 テーブル名はDatabaseのキー・ワードで修飾 列名はDatabase.(テーブル名)で修飾 ・相関名の利用が可能、通常は相関名を利用 data(ROW変数) SELECTの結果セットは配列(‘[]’)に取得 --> LocalEnvironmentツリーやROW変数を利用 スカラー変数には入れられない PASSTHRUでも同じ RECORD[1] COL1 COL2 : RECORD[2] COL1 COL2 : 140 結果行に対応 エレメントの名前は列名になる (または、ASで指定した別名) COL1 COL2 データベース・アクセス ESQL-SELECT 制限 列関数はCOUNT、MAX、MIN、SUMのみ使用可能、AVGは使用できない SELECT GROUP ALL、SELECT DISTINCTは使用できない BY、HAVING、ORDER BYは使用できない 拡張 ITEM、THEのキーワードが使用できる 列関数、AS句、WHERE節などでESQLの関数や演算子が使用できる など ITEM 一列の照会で使用可能、カラム名を削除して値だけを取得 data(ROW変数) DECLARE data ROW; SET data.RECORD[] = SELECT ITEM T.COL1 FROM TABLE01 AS T WHERE T.COL01 = Body.FLD01; RECORD[1] エレメントに値が入る RECORD[2] カラム名のエレメントは 作成されない : COL1 COL2 141 データベース・アクセス THE 結果セットから先頭の一行だけを取得 data(ROW変数) DECLARE data ROW; SET data.RECORD = THE(SELECT T.* FROM TABLE01 AS T WHERE T.COL01 = Body.FLD01); RECORD COL1 : COL2 結果が一行であることが分かっているので、配列(‘[]’)でなくても入れられる ・スカラー変数に入れることはできない COL1 ITEM + THE スカラー値が戻るので、スカラー変数に値を取得することが可能 DECLARE TEMP INTEGER; SET TEMP = THE(SELECT ITEM T.COL1 FROM TABLE01 AS T WHERE T.COL02 = Body.FLD02); 列関数にESQL関数を使用 DECLARE data ROW; SET data.RECORD = SELECT T.COL1 BETWEEN 100 AND 200 FROM TABLE01 AS T); データベースから結果セットを受け取り、ESQL関数で選択を実行 ・パフォーマンス上、データベースで選択を実行する方が好ましい 142 COL2 データベース・アクセス PASSTHRUでのデータベース・アクセス PASSTHRU(‘INSERT INTO TABLE01 VALUES(?, ?)’, Body.FLD01, Body.FLD02); DECLARE data ROW; SET data.RECORD[] = PASSTHRU(‘SELECT * FROM TABLE01 WHERE COL01 = (?) ORDER BY COL01’, Body.FLD01); PASSTHRUの第1パラメータは置換パラメータを‘?‘で指定したストリング形式のSQL ・置換パラメータ数分の値のリストを第2パラメータ以降に指定 PASSTHRUはステートメントにも関数にもなる ・INSERT/UPDATE/DELETEを実行するときはステートメント、SELECTを実行するときは関数 ・SELECTの結果セットは配列(‘[]’)で受ける (LocalEnvironmentツリーやROW変数を利用) ストアード・プロシージャーの呼び出しも可能. ただし、複数の結果セットを返却するストアード・プロシージャーの 呼び出しをサポートするなど、CREATE PROCEDURE LANGUAGE DATABASEの方が高機能 143 データベース・アクセス PASSTHRUを使用すると、動的に組み立てたSQL文の実行が可能 列名を動的に決定するSQL文はPASSTHRUでのみ実行可能 SET SQL = ‘DELETE FROM TABLE01 ‘ || ‘ WHERE ’ || Body.column_name || ‘ = ‘ || Body.column_value; PASSTHRU(SQL); MQSI_EMPTY_DB_CACHE環境変数の設定が必要 –PASSTHRUのデータベース・アクセスは、SQLPrepareでSQLステートメントが準備される –準備済みSQLステートメントはキャッシュされて再利用される –列名を動的に決定するSQL文を実行すると、大量にSQLステートメントがキャシュされる -> メモリを大量に使用、最終的にはSQL0954Cエラー –MQSI_EMPTY_DB_CACHE=ONを設定すると、 毎回、準備済みSQLステートメントが廃棄される(キャッシュされなくなる) 144 データベース・アクセス その他 スキーマの指定 明示的に指定しないと、ブローカー属性のデータベース・アクセス・ユーザーがスキーマ名になる /* NSERT/UPDATE/DELETE/SELECT */ INSERT INTO Database.SCHEMA01.TABLE01 VALUES(Body.FLD01, Body.FLD02); /* PASSTHRU */ PASSTHRU(‘INSERT INTO SCHAMA.TABLE01 VALUES(?, ?)’, Body.FLD01, Body.FLD02); /* データベース・ストアード・プロシージャー の呼び出し*/ CALL proc_name(Body.FLD01, Body.FLD02) IN Database.SCHEMA01; 複数データベース・アクセス 1つのノードから複数のデータベースへアクセス可能 アクセス対象のデータベース名(DSN)をノードのプロパティでなく、ESQLで指定 –データベース名を指定するときは、スキーマの指定も必要 /* NSERT/UPDATE/DELETE/SELECT */ INSERT INTO Database.USERDB01.SCHEMA01.TABLE01 VALUES(Body.FLD01, Body.FLD02); /* PASSTHRU */ PASSTHRU(‘INSERT INTO SCHAMA01.TABLE01 TO Database.USERDB01 VALUES(?, ?)’ , Body.FLD01, Body.FLD02); /* データベース・ストアード・プロシージャー の呼び出し*/ CALL db_proc_name(Body.FLD01, Body.FLD02) IN Database.USERDB01.SCHEMA01; 145 データベース・アクセス データベース名、スキーマ名、テーブル名の動的指定 { }で括ると、動的に名前解決が可能 Database.{Body.DB_NAME}.{Body.SCHEMA_NAME}.{‘TABLE‘ || Body.NUMBER}; 非サポートのデータ・タイプ 以下のデータ・タイプをサポートしない データベース データ・タイプ DB2 GRAPHIC、VARGRAPHIC, LONGVARGRAPHIC, DBCLOB Oracle NCHAR, NVARCHAR, NVARCHAR2, NCLOB SQL Server NCHAR, NVARCHAR, NTEXT Sybase NCHAR, NVARCHAR, NTEXT、UNICHAR、UNIVARCHAR Infomix NCHAR, NVARCHAR 146 ESQLモジュール、プロシージャーの共用 ESQLファイルのスコープ 同一プロジェクト内の任意のESQLファイルを任意のメッセージ・フローから参照可能 自動でメッセージ・フロー単位にESQLファイルが作成されるが、スコープを制限しているわけではない ESQLモジュールの共用 異なるメッセージ・フローの複数のプロセス・ノードから同じESQLモジュールを呼び出すことが可能 同一メッセージ・フロー・プロジェクト (プロジェクト参照しているプロジェクトを含む) ESQLファイル(共通) メッセージ・フロー1 ESQLモジュール メッセージ・フロー2 ESQLファイル (メッセージ・フロー1) ESQLファイル ESQLモジュール (メッセージ・フロー2) ESQLモジュール 147 ESQLモジュール、プロシージャーの共用 定数、関数、プロシージャーの共用 スキーマ・レベルに定義した定数・関数・プロシージャーは、 同一プロジェクト内の任意のESQLモジュールから参照可能 定数・関数・プロシージャーをESQLモジュールの外側で定義 変数はスキーマ・レベルで定義できない ESQLファイル(共通) メッセージ・フロー1 定数、関数、プロシージャー メッセージ・フロー2 ESQLファイル (メッセージ・フロー1) 同一メッセージ・フロー・プロジェクト (プロジェクト参照しているプロジェクトを含む) ESQLファイル ESQLモジュール (メッセージ・フロー2) ESQLモジュール DECLARE ・・・ スキーマ・レベル ・同一プロジェクト内のモジュールから参照可能 CREATE COMPUTE MODULE msgflow01_Compute DECLARE ・・・ : モジュール・レベル ・該当モジュール内のプロシージャーから参照可能 CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE ・・・ : END; END MODULE; プロシージャー・レベル ・該当プロシージャーからのみ参照可能 148 トランザクション制御 149 メッセージ・フローとトランザクション 資源の更新と同期点処理 デフォルトの設定では、MQInputノードのMQGET、 MQOutputノードのMQPUT、データベースへの更新は同期点処理に参加する データベース処理と合わせ、メッセージ・フローの成否でコミット/バックアウトが決定 メッセージ・フローが最後まで正常に終了するとコミットが発行される 各々のノードの「トランザクション・モード」プロパティ(下線がデフォルト) トランザクションモード MQInput MQOutput 自動 パーシステント・メッセージは同期点処理する MQInputノードの決定に従う はい 同期点処理する 同期点処理する いいえ 同期点処理しない 同期点処理しない トランザクションモード データベース・アクセス(Databaseノード、ほか) 自動 ブローカーにコミットを任せる コミット ノード通過時に即時にコミット MQGET Syncpoint 150 SQL.UPDATE MQPUT Syncpoint コミット処理 メッセージ・フローとトランザクション UOW(Unit of Work) メッセージ・フローが正常終了したときのコミット方法を選択可能 ブローカー整合 メッセージ・フローが成功すると、SQL COMMITとMQCMITでデータベースとMQを個別にコミット データベースのコミットを先に実行 SQL.commit MQGET Syncpoint SQL.UPDATE MQCMIT MQPUT Syncpoint グローバル整合 MQをコーディネータとした2フェーズ・コミット、MQBEGINが発行される –メッセージ・フローをデプロイするとき、メッセージの実行時属性「整合トランザクション」の設定が必要 –キュー・マネージャーをコーディネーターとするMQレベルの設定も必要 メッセージ・フローが成功すると、MQCMITでMQとデータベースをコミット MQBEGIN MQCMIT MQGET Syncpoint SQL.UPDATE MQPUT Syncpoint 151 メッセージ・フローとトランザクション 考慮点、他 同一データベース更新で自動コミットと即時コミットの混在するときの注意点 UNIX/PC版のWMBでは、即時コミットのタイミングで、自動コミットも一緒にコミットされる トランザクション・モード「自動」 トランザクション・モード「コミット」 MQGET Syncpoint SQL.UPDATE SQL.UPDATE MQPUT Syncpoint SQL.commit 後続のコミットにより「自動」の設定でもコミットされる 即時コミットと自動コミットを混在させるときは、 複数のODBCデータソースを作成して異なるデータベースに見せかけてアクセス デッドロック発生の可能性を十分に考慮 –データベースからも別アプリケーションからの接続に見える ->「自動コミット」ノードがロックしているレコードに「即時コミット」のノードはアクセスできない 152 MQCMIT エラー処理 153 エラー処理 デフォルトのエラー処理 プロセス・ノードはエラーを検知すると例外を生成 メッセージのパース/組み立てに失敗 、ESQLの実行時エラー、 データベース・アクセスに失敗、キューにPUT/GETできない など デフォルト(例外を捕捉しないとき)のエラー処理ロジック 資源(データベース、MQ)のバックアウトと例外ツリーに記録されているエラー情報をエラー・ログへ出力 エラー・ログの出力先 MQGET SQL.UPDATE MQPUT ExceptionListツリーの生成 資源のバックアウトとエラー・ログの出力 SQL ROLLBACK、MQBACKの発行 (2フェーズ・コミットのときはMQBACKのみ発行) 例外を捕捉して、独自のエラー処理ロジックを実行することも可能 154 Windwos イベント・ログ UNIX syslog エラー処理 ExceptionListツリーの例 (0x01000000):RecoverableException = ( (0x03000000):File = 'F:¥build¥S610_P¥src¥DataFlowEngine¥ImbMqOutputNode.cpp' (CHARACTER) (0x03000000):Line = 895 (INTEGER) (0x03000000):Function = 'ImbMqOutputNode::evaluate' (CHARACTER) (0x03000000):Type = 'ComIbmMQOutputNode' (CHARACTER) (0x03000000):Name = 'TEST01#FCMComposite_1_2' (CHARACTER) (0x03000000):Label = 'TEST01.MQOutput' (CHARACTER) ExceptionListツリーの最後のエレメントに最初に発生した (0x03000000):Catalog = 'BIPv610' (CHARACTER) 例外がセットされている (0x03000000):Severity = 3 (INTEGER) (0x03000000):Number = 2230 (INTEGER) (0x03000000):Text = 'Caught exception and rethrowing' (CHARACTER) (0x01000000):MessageException = ( (0x03000000):File = 'F:¥build¥S610_P¥src¥DataFlowEngine¥ImbMqOutputNode.cpp' (CHARACTER) (0x03000000):Line = 2316 (INTEGER) (0x03000000):Function = 'ImbMqOutputNode::putMessage' (CHARACTER) (0x03000000):Type = 'ComIbmMQOutputNode' (CHARACTER) (0x03000000):Name = 'TEST01#FCMComposite_1_2' (CHARACTER) (0x03000000):Label = 'TEST01.MQOutput' (CHARACTER) (0x03000000):Catalog = 'BIPv610' (CHARACTER) (0x03000000):Severity = 3 (INTEGER) (0x03000000):Number = 2667 (INTEGER) (0x03000000):Text = 'Failed to put message' (CHARACTER) (0x01000000):Insert = ( (0x03000000):Type = 2 (INTEGER) (0x03000000):Text = '-1' (CHARACTER) ) (0x01000000):Insert = ( (0x03000000):Type = 5 (INTEGER) (0x03000000):Text = 'MQW102' (CHARACTER) ) (0x01000000):Insert = ( (0x03000000):Type = 2 (INTEGER) BIP2667E (0x03000000):Text = '2051' (CHARACTER) An error occurred in node '<insert_6>' writing message to ) queue '<insert_5>' on queue manager '<insert_4>'. State = (0x01000000):Insert = ( '<insert_0>' '<insert_1>' '<insert_2>' '<insert_3>' (0x03000000):Type = 5 (INTEGER) Explanation (0x03000000):Text = '' (CHARACTER) An error occurred when a message flow node attempted to ) write a message to a queue. The reason code from the MQPUT (0x01000000):Insert = ( is displayed as the 3rd (native error) state. (0x03000000):Type = 5 (INTEGER) (0x03000000):Text = '' (CHARACTER) Response ) Check the WebSphere MQ completion and reason codes in the (0x01000000):Insert = ( WebSphere MQ Application Programming Reference manual to (0x03000000):Type = 5 (INTEGER) establish the cause of the error, taking any appropriate (0x03000000):Text = 'MB_OUT' (CHARACTER) action. It may be necessary to restart the message broker ) after you have performed this recovery action. ) ) 155 エラー処理 エラー・メッセージの例 イベントの種類: エラー イベント ソース: WebSphere Broker v6102 イベント カテゴリ: なし イベント ID: 2628 日付: 2006/08/26 時刻: 13:55:27 ユーザー: N/A コンピュータ: IBM-DC39DD0ED63 説明: ( WMB61BK.default ) 入力ノード 'TEST01.MQInput' で例外条件が検出されました。 入力ノード ‘TEST01.MQInput’ が、メッセージを処理中にエラーを検出しました。 メッセージ・フローはロールバックされ、メッセージが作業単位で処理されて いた場合、メッセージは再び処理されるために 入力キューにとどまります。 後続のメッセージが、この例外の原因を示しています。 後続のエラー・メッセージを調べて例外が生成された原因を判別し、それらのメッセージに記述されている処置を行ってください。 イベントの種類: エラー イベント ソース: WebSphere Broker v6102 イベント カテゴリ: なし イベント ID: 2230 日付: 2006/08/26 時刻: 13:55:27 ユーザー: N/A コンピュータ: IBM-DC39DD0ED63 説明: ( WMB61BK.default ) ノード 'TEST01.MQOutput' でメッセージを処理中にエラーが検出されました。 メッセージ・ブローカーがメッセージをノード ‘TEST01.MQOutput’ で処理中に、エラーを検出しました。 メッセージの処理をショート・カットするために例外が スローされています。 エラーの詳細については、後続のメッセージを参照してください。 イベントの種類: エラー イベント ソース: WebSphere Broker v6102 イベント カテゴリ: なし イベント ID: 2667 日付: 2008/08/26 時刻: 13:55:27 ユーザー: N/A コンピュータ: IBM-DC39DD0ED63 説明: ( WMB61BK.default ) キュー・マネージャー '''' でキュー ''MB_OUT'' にメッセージを書き込むときに、ノード 'TEST01.MQOutput' でエラーが発生しました。 状態 = '-1' ''MQW102'' '2051' '''' メッセージ・フロー・ノードがキューにメッセージを書き込もうとしたときに、エラーが発生しました。 MQPUT からの理由コードは、3 番目 (ネイティブ・エラー) の 状態として表示されます。 WebSphere MQ 完了コードと理由コードを「WebSphere MQ アプリケーション・プログラミング・リファレンス」で調べ、 エラーの原因を確定し、適切な処置 を行ってください。 このリカバリー処置の後に、メッセージ・ブローカーの再始動が必要になる場合がありま 156 エラー処理 ポイズン・メッセージ ポイズン・メッセージ 何度もバックアウトが発生しているメッセージ メッセージ自体が問題を含んでいる可能性があり、エラー・キューへの廃棄などが必要 ポイズン・メッセージの処理 MQInputノードは、MQMDのBackoutCountとキューの「バックアウト閾値(BOTHRESH)」を比較. BackoutCount > BOTHRESHのメッセージをポイズン・メッセージとして扱う エラー・キュー Failure Out MQMD バックアウトの度に、MQMD.BackoutCountが+1される MQInputノードは、ポイズン・メッセージをFailureターミナル、 キューの「バックアウト・リキュー(BOQNAME)」、デッド・レター・キューに廃棄 157 MQInputノードの処理 <参考> MQInputノードの処理 受信メッセージのBackoutCountとキューのBOTHRESH属性の値を比較し、出力先を決定 Failureターミナルの接続有無やバックアウト・キュー、デッド・レター・キューの有無により、出力先(ターミナル、キュー)は異なる BOTHRESH属性が0(デフォルト)の場合、フローはBOTHRESH=1として処理 MQInputノード BackoutCount < BOTHRESH BackoutCount : BOTHRESH? BackoutCount >= BOTHRESH Outターミナルへ (正常処理フロー) YES Failureターミナルが 接続されている? エラー処理中に例外が発生した場合 Failureターミナルへ (エラー処理フロー) NO BackoutCount < BOTHRESH×2 BackoutCount : BOTHRESH? バックアウト BackoutCount >= BOTHRESH×2 NO BOQまたはDEADQが定義されている? バックアウトを繰り返す YES BOQNAMEが定義されている? YES 指定されたキューへPUT MQPUTに失敗した場合 NO DEADQが定義されている? YES MQPUTに失敗した場合 DEADQへPUT NO バックアウトを繰り返す 158 ※バックアウトされたメッセージは入力キューに戻り、 1秒後に再処理されます。 エラー処理 ポイズン・メッセージ Failureターミナル、バックアウト・リキュー、デッド・レター・キューがないと・・・ メッセージは入力キューに滞留し、無限にバックアウトを繰り返す --> メッセージ・フローを停止して、メッセージを抜く運用が必要 メッセージの順序保証要件がない場合は、Failureターミナル、バックアウト・リキュー、デッド・レター・ キューのいずれかを使用 159 blank 160 エラー処理 例外の捕捉 例外の捕捉 Catchターミナル(MQInput/TryCatchノード)、 Failureターミナル(MQInputノード以外)で例外の捕捉が可能 例外を捕捉した場合、「業務としての整合性」、「エラー・ログの出力」はユーザー責任 エラー処理が成功すると資源はコミット(バックアウトされないので注意) エラー・ログも出力されない –生成されたExceptionListツリーは参照可能、エラー・ログが必要ならTraceノードでダンプ ※資源はバックアウトでなく、コミットされることに注意 MQGET SQL.UPDATE MQPUT ExceptionListツリーの生成 ExceptionListツリーをファイルに書き出し SQL COMMIT、MQCMITの発行 (2フェーズ・コミットのときはMQCMITのみ発行) 161 エラー処理 例外の捕捉 CatchターミナルとFailureターミナルの違い Catchターミナル 後続処理でのすべての例外を捕捉 –例外を捕捉したエラー処理での例外も捕捉 Failureターミナル 接続されたノードでの例外だけを捕捉 エラー・キュー エラー・キュー 出力キュー エラー・キュー このFailureターミナルではエラーは捕捉されない エラー・キュー 出力キュー 162 エラー処理 例外の捕捉 例外の処理フロー 例外発生 Failureターミナルが接続されている? YES Failureターミナルへ NO 1つ上流のノードに戻る YES TryCatchノード? Catchターミナルへ NO MQInputノード? NO YES YES Catchターミナルが接続されている? NO バックアウト (メッセージは入力キューに戻る) 163 blank 164 Catchターミナルへ エラー処理 例外の捕捉 「業務としての整合性」 データベース更新あり、1入力:N出力のメッセージ・フローでは「業務としての整合性」に注意 業務として「キュー(1)、(2)への正常な出力」、「エラー・キューへの出力」のいずれかで動作させたくても・・・ 出力キュー(1) 入力キュー 出力キュー(2) エラー・キュー 分岐したフローの実行順序は不定 出力キュー(1) -> (2)の順で処理された場合は、エラー・キューにだけメッセージが出力される 出力キュー(2) -> (1)の順で処理された場合は、出力キュー(2)とエラー・キューにメッセージが出力される 165 エラー処理 例外の捕捉 エラー処理に流れるメッセージ 例外を捕捉したとき、正常フローで実行されたメッセージの更新が無効になっているが・・・ 保持しているメッセージのコピーをエラー処理に流しているだけ 資源のバックアウトとは無関係 正常フローでのメッセージの更新が無効になっているので、データベースの更新も無効になると考えがちだが・・・ 出力キュー 入力キュー Catch エラー・キュー メッセージの更新 データベースの更新 正常フロー メッセージのコピー エラー処理フロー SQL.commit MQCMIT 例外を捕捉したとき、エラー処理に流れるメッセージは直前のコピー 正常フローで行ったメッセージ・ツリー、LocalEnvironmentツリーに対する更新は無効 –Environmentツリーの更新は引き継がれる 166 エラー処理 フロー処理中に発生したエラーをハンドリングして、独自のエラー処理を実装可能 エラー処理用のプロセス・ノード一覧 役割 エラー処理 ノード名 説明 例外の生成 例外の捕捉 メッセージのダンプ Throw TryCatch Trace その他 ESQL内で例外を捕捉することも可能 167 TryCatchノード 後続処理で発生した例外を捕捉して、エラー処理を実行 Tryターミナルの後続処理で例外が発生すると、Catchターミナルの処理を実行 -In -Catch ※ -Try ※ Catch、Try: Tryターミナルから後続ノードにメッセージを渡し、後続の処理で 例外が発生したとき、Catchターミナルからメッセージを出力 設定プロパティは特になし 168 Throwノード 例外をスローさせることが可能 出力させるエラー・メッセージ、メッセージ番号なども指定可能 -In BIP3001I Exception thrown by throw node '<insert_1>'; text is '<insert_0>'. Explanation The throw node '<insert_1>' has received a message and thus has thrown an exception as this is its normal behavior. The message text associated with this exception is '<insert_0>'. Response Since this is application generated (by message flow behavior), the user action is determined by the message flow and the type of exception generated. 3001~3049まで同一メッセージ 主な設定プロパティ (「基本」タブ) 属性 説明 メッセージ・カタログ 生成した例外がローカル・エラー・ログに出力されるときに参照されるカタログ (デフォルトはシステム提供のカタログ ) メッセージ番号 システム提供カタログでは3001~3049を使用 (下記のメッセージを出力) メッセージ・テキスト 挿入するメッセージ・テキスト (下記メッセージの<insert_0>を置き換え) 169 Traceノード メッセージ・フローからシステム・ログやファイルなどに情報を書き出すノード フロー単位でトレースノードのON/OFFの設定が可能 ツールキットまたはmqsichangetraceコマンドで設定 -In -Out BIP3051E Error message '<insert_0>' from trace node '<insert_1>'. Explanation The trace node '<insert_1>' has output the specified error message. Response This is an error message provided by the message flow designer. The user response will be determined by the local environment. 3051~3099まで同一メッセージ 主な設定プロパティ (「基本」タブ) 属性 説明 宛先 情報の書き出し先 (下記から選択) ・「ローカル・エラー・ログ」 システム・ログ(イベント・ログ、または、syslog) ・「ユーザー・トレース」 メッセージ・フローのトレース・ファイル ・「ファイル」 ユーザーが指定したファイル ファイル・パス ファイル名(「宛先」で「ファイル」を選択したときに指定) メッセージ・カタログ ローカル・エラー・ログ、ユーザー・トレースに情報を出力するときに参照されるカタログ (デフォルトはシステム提供のカタログ ) メッセージ番号 システム提供カタログでは3051~3099を使用 パターン 挿入するメッセージ・テキスト (下記メッセージの<insert_0>を置き換え) 170 Traceノード パターンの記述 例 Message passed through with the following fields: Store name is ${Body.storedetailselement.storename} Total sales are ${Body.totalselement.totalsales} Time is: ${EXTRACT(HOUR FROM CURRENT_TIMESTAMP)}:${EXTRACT(MINUTE FROM CURRENT_TIMESTAMP)} 任意のテキスト、および、ESQL表現を記述 ESQL表現は${ ${Root} }で括る や ${ExceptionList}で論理メッセージ全体のダンプも可能 171 ESQLでのエラーハンドリング SQLエラー・ハンドラ ノード内で発生した例外をESQLで捕捉して処理 エラー・ハンドラで捕捉する例外種別を、SQLステートで指定 CONTINUEハンドラ、EXITハンドラの2種類をサポート CONTINUEハンドラ EXITハンドラ : ハンドラの処理実行後、例外を生成した次のステートメントから処理を継続 : ハンドラの処理実行後、ハンドラが設定してあるブロックから抜ける THROWステートメント ESQLで例外を生成 (Thowノードと同等の処理) LOGステートメント ESQLでシステム・ログなどに情報を出力(Traceノードと同等の処理) 情報の出力先はシステム・ログ、または、ユーザー・トレース (ファイルへの出力は不可) THROWステートメントと異なり、例外は生成しない CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN DECLARE EXIT HANDLER FOR SQLSTATE 'S22012' BEGIN LOG EVENT SEVERITY 1 MESSAGE 2951 VALUES ('Catch the Error'); RESIGNAL; END; DECLARE A,B,C INTEGER; 172 SET A=1; : : SET B=0; SET C=A/B; メッセージ・フロー デザインTips アプリケーション連携パターン 順序保障 汎用メッセージ・フローの実装 メッセージ・フローのネスティング 情報の受け渡し 実行時セキュリティ 173 blank 174 アプリケーションの連携パターン 主な連携パターンの決定要素 メッセージの流れ:一方向型、またはリクエスト/リプライ型 接続アプリケーションの数:1対1接続、または1対N接続 Collectorノードを使用してN個の送信元アプリケーションとの連携も実現可能 送信元アプリ 送信先アプリ ① フロー・パターン 一方向 1 1 説明 1つの入力メッセージを処理し、単一の宛先に出力 一般的なフロー・パターン ② 一方向 1 n 1つの入力メッセージを処理し、複数の宛先に出力 複数宛先に同一メッセージを送ることも、宛先ごとに異なるメッセージを送ることも可能 (詳細は「一方向型の1対N連携の実装例」を参照) ③ リクエスト/リプライ 1 1 一方向型の1対1連携のフローを双方向分作成する 但し、応答先情報の引継ぎが必要となる (詳細は「リクエスト・リプライ型の1対1連携の実装例」を参照) ④ リクエスト/リプライ 1 n 一方向型の1対1連携のフローを双方向分作成し、Aggregationノードを使用する 【一方向型連携】 【リクエスト・リプライ型連携】 Application WMB Application Application WMB Application Application WMB Application Application WMB Application Application Application 175 一方向型の1対N連携の実装例 同一メッセージを複数の宛先に出力する場合 宛先リストを使用して複数宛先に送信 MQOutputノードの「宛先モード」を「宛先リスト」に設定 ESQLを使用して、LocalEnvironmentツリーの宛先情報を設定 LocalEnvironmentツリーにはキュー名以外にも、MQOutputノードと同等のプロパティを設定可能 Computeノードでの実行例 /* 配列で指定すれば、複数のキューに同時に出力 */ SET OutputLocalEnvironment.Destination.MQ[1].DestinationData.queueName = ‘QL.OUT1’; SET OutputLocalEnvironment.Destination.MQ[2].DestinationData.queueName = ‘QL.OUT2’; 宛先ごとに異なるメッセージを出力する場合 1つの入力メッセージを途中でコピーし、それぞれの宛先にあわせた処理を実施して出力 フローを途中で分岐させ、複数の出力ノードを配置 メッセージは分岐の数分コピーされる Application Application Application 176 一方向型の1対N連携の実装例 宛先ごとにメッセージを作成し、宛先リストの宛先を変えながら、PROPAGATE関数でメッセージ を出力 (PROPAGATE関数の詳細は後述) 例:データベースから読み込んだ宛先(可変個)に、宛先ごとにコード変換したメッセージを送信 「宛先モード」を 「宛先リスト」に設定 Application Application WHILE 条件式 DO SET OutputRoot = InputRoot; SET OutputRoot.MQMD.CodedCharSetId = ・・・ SET OutputLocalEnvironment.Destination.MQ.DestinationData.queueName = ・・・ PROPAGATE; END WHILE; RETURN FALSE; 177 リクエスト/リプライ型の1対1連携の実装例 一方向型の1対1連携を双方向に用意 要求メッセージをルーティングするフロー、応答メッセージをルーティングするフローをそれぞれ作成 クライアント・アプリケーションに応答を返すために、応答先情報の引継ぎが必要 メッセージ内に保存して引き継ぐ データベースに保存して引き継ぐ 応答先情報を応答処理フローの入力 キューに付け替え ReplyToQMgr : CLNT_QMGR ReplyToQ : REPLYQ クライアントAPPL ReplyToQMgr : WBIMB_QMGR ReplyToQ : INPUTQ サーバーAPPL MQGET wait 要求処理フロー MQPUT 処理 Copy MsgId to CorrelId MQGET wait 本来の応答先キュー: REPLYQ@CLNT_MGR MQPUT 応答処理フロー WMBの入力キュー: INPUTQ@WMB_QMGR 応答先情報を本来の応答キューに付け替え 応答メッセージと本来の応答先とを紐付けるための仕組みが必要となる 178 リクエスト/リプライ型の1対1連携の実装例 応答先情報の引継ぎ方法 メッセージ内に保存して引き継ぐ (詳細後述) サーバー・アプリケーションが応答先情報を持ち回るように作成されていなければならない –MQMDの空きフィールドに保存 : ApplIdentityData(MQCHAR32)の利用がお勧め ユーザー・データ MQMD –ユーザー・ヘッダーのフィールドに保存 MQMD ユーザー・ヘッダー ユーザー・データ データベースに保存して引き継ぐ 要求処理フローで、MsgIdをキーにして応答先情報を保存 – MQMD.MsgId(キー値)、ReplyToQ、ReplyToQmgr、タイムスタンプ 応答処理フローで、MQMD.CorrelIdの値を使って応答先情報を照会 + レコードの削除 応答処理フローにメッセージが戻らないと、データベースに応答先情報が残ってしまう –タイムスタンプを参照し、一定時間を経過しているレコードの削除処理が必要 メッセージ内に保存して持ちまわる方法が単純でお勧め 179 応答情報の引継ぎ例 応答情報の引継ぎ例 : MQMD.ApplIdentityDataを利用 要求処理フローで必要なESQL、設定 <参考> 16バイト 16バイト ReplyToQ ReplyToQMgr ApplIdentityDataは32バイトしかないため、ReplyToQとReplyToQMgrが収まるように 16バイトずつ使用するなどの調整が必要 SET–OutputRoot.MQMD.ApplIdentiryData = OVERLAY(OutputRoot.MQMD.ApplIdentiryData PLACING TRIM(InputRoot.MQMD.ReplyToQ FROM 1); SET OutputRoot.MQMD.ApplIdentiryData = OVERLAY(OutputRoot.MQMD.ApplIdentiryData PLACING TRIM(InputRoot.MQMD.ReplyToQMgr FROM 17) ; SET OutputRoot.MQMD.ReplyToQ = ‘xxxxxx’ SET OutputRoot.MQMD.ReplyToQMgr = ‘’ //応答処理フローの入力キュー //MQPUTでのデフォルト設定に任せる MQOutputノードの「メッセージ・コンテキスト」を 「すべて設定」に設定 メッセージ・コンテキスト:「すべて設定」 MQPMO_SET_ALL_CONTEXTでPUT 180 応答情報の引継ぎ例 <参考> 応答処理フローで必要なESQL、設定 応答メッセージのMQMD.ApplIdentityDataからReplyTo、ReplyToQMgrを回復 ComputeノードのESQL SET OutputRoot.MQMD.ReplyToQ = SUBSTRING(InputRoot.MQMD.ApplIdentiryData FROM 1 FOR 16); SET OutputRoot.MQMD.ReplyToQMgr = SUBSTRING(InputRoot.MQMD.ApplIdentiryData FROM 17 FOR 16) ; MQOutputノードの「宛先モード」を「応答先キュー」に 設定して応答メッセージを返却 宛先モード:「応答先キュー」 MQMD.ReplyToQにメッセージをPUT 181 blank 182 アプリケーションの連携パターン 送受信するメッセージの単位 1メッセージ単位の連携か、複数メッセージ単位での連携か 入力メッセージ数 出力メッセージ数 説明 A 1 1 1つの入力メッセージを1つのメッセージとして出力 一般的なフロー・パターン B 1 n 1つの入力メッセージを複数のメッセージに分割して出力 (詳細は「1入力メッセージ、複数出力メッセージの実装例」を参照) C n 1 複数の入力メッセ-ジを1つのメッセージとして出力 通常WMBは1入力メッセージごとに処理を行うため、複数の入力メッセージをマージするには、一時的 にデータを保持する外部リソース上が必要 また、Collectorノードの使用も可能 (詳細は「複数入力メッセージ、1出力メッセージの実装例」を参照) D n n 複数のメッセージをグループとして処理し、グループ単位で処理を完了 MQのグループ・メッセージ機能を使用 (詳細は「複数メッセージ単位での連携の実装例」を参照) 【N入力メッセージ→1出力メッセージ】 【1入力メッセージ→1出力メッセージ】 WMB Application Application Application Application WMB Application 【Nメッセージ単位の連携】 【1入力メッセージ→N出力メッセージ】 WMB Application WMB Application Application 183 1入力メッセージ、複数出力メッセージの実装例 1入力メッセージから複数の出力メッセージを生成 複数の明細が含まれるメッセージを明細ごとに分割して、宛先に送信する場合など PROPAGATE関数を使用 複数明細を1MQメッセージとして送信 MQMD 明細1 明細2 明細ごとに分割して、宛先へ送信 ・・・ MQMD MQMD 明細1 明細2 Application Application : WHILE 条件式 DO 明細ごとに出力メッセージを作成 PROPAGATE; END WHILE; RETURN FALSE; 184 PROPAGATE処理 PROPAGATEステートメント ESQLの実行途中で、論理メッセージ・ツリーを後続ノードに流す 後続ノードに流れるのは、ステートメント実行時点に作成されている論理メッセージ・ツリー 後続ノードの処理が完了すると制御が戻り、ESQLの次のステートメントが実行される Computeノード、Databaseノードで使用可 Filterノードでは使用不可 RETURNでモジュールが終了する前に、後続ノードにメッセージを流す. 制御はPROPAGATEの直後に戻る : PROPAGATE; : RETURN; <メッセージ分割のESQL例> 入力メッセージ CREATE COMPUTE MODULE msgflow01_Compute MRM CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN Order DECLARE I INTEGER 1; DECLARE J INTEGER CARDINALITY(InputBody.Order.List[]); WHILE I <= J DO CALL CopyMessageHeaders(); : SET OutputRoot.MRM.Order.OrderNo = InputBody.Order.OrderNo; SET OutputRoot.MRM.Order.”Item Code” = InputBody.Order.List[I].”Item Code”; : PROPAGATE; SET I = I + 1; END WHILE; Order List[1] No Item Code Quantit y List[2] : 出力メッセージ MRM 通常、ESQL終了時には論理メッセージを流す必要がな いので、RETURN FALSEで終了 RETURN FALSE; END; : 185 PROPAGATE処理 出力先の指定、出力メッセージの選択オプション 出力ターミナルの選択 Compute、Databaseノードの出力ターミナル (Failure、Out、Out1~4) PROPAGATE TO TERMINAL ‘out4’; ターミナル名は先頭の文字が大文字になっているが、PROPAGATEで指定するときは全て小文字 数字でも指定可能(Failure :-1、Out :0、Out1:1、・・・) Labelノードへの出力 PROPAGATE TO LABAL ‘label_name’; 出力するメッセージの選択 (Computeノードのみ) InputツリーとOutputツリーのどちらを出力するかを選択 – 指定がなければノードの「計算モード」属性の設定値に従う – ノードの「計算モード」属性の設定値よりも優先 Root、LocalEnvironment、Exceptionツリーのそれぞれで選択可能 PROPAGATE TO TERMINAL ‘failure’ MESSAGE InputRoot ENVIRONMENT InputLocalEnvironement EXCEPTION OutputExceptionList; 186 Order Order No Item Code Quantity PROPAGATE処理 <参考> ターミナル指定の利用例 要求メッセージの分割と結果メッセージを1つにまとめるリクエスト/リプライ処理 入力メッセージ内の複数の処理要求を分割し、Outに出力 –後続処理では、プロバイダーへ処理要求を送信し、処理結果をEnvironmentツリーに保存 すべての処理要求を送信したら、Environemtツリーの処理結果を一つのメッセージにまとめてOut1に出力 –後続処理では、アプリケーションにメッセージを返信 : WHILE 入力メッセージから処理要求を1つ取り出し、出力メッセージを作成 PROPAGATE TO TERMINAL ‘out’; END WHILE; サービス・プロバイダー Environmentの処理結果から出力メッセージを作成 PROPAGATE TO TERMINAL ‘out1’; : RETURN FALSE; HTTP 処理1 MQMD 処理1 処理2 処理2 結果1 ・・・ 結果2 Outターミナル Out1ターミナル MQアプリケーション 蓄積された処理結果を参照して、 結果メッセージを作成 MQMD 結果1 187 結果2 ・・・ Environment 処理結果をEnvironemtツリーに蓄積 PROPAGATE処理 <参考> メッセージの削除オプション(Computeノードでのみ有効) デフォルトでは、PROPAGATEしたメッセージ・ツリーは削除 DELETE NONE を指定すると、PROPAGATE後もメッセージ・ツリーは削除されない さらに、FINALIZE NONE を指定すると、PROPAGATE後のメッセージ・ツリーの変更が可能 FINALIZE NONE を指定しないと、PROPAGATE後には変更ができないメッセージ・ツリーが残る CALL CopyMessageHeaders(); SET OutputRoot.XML.msg.elm01 = 'aaa'; PROPAGATE FINALIZE NONE DELETE NONE; <msg><elm01>aaa</elm01></msg> SET OutputRoot.XML.msg.elm02 = ‘bbb’; PROPAGATE FINALIZE NONE DELETE NONE; <msg><elm01>aaa</elm01><elm02>bbb</elm02></msg> PROPAGATE後もメッセージは削除されないため、<elm01>が残っている 188 複数入力メッセージ、1出力メッセージの実装例 複数入力メッセ-ジを1つの出力メッセージにまとめて出力 複数の処理結果を、1メッセージにマージして、宛先に送信する場合など Collectorノードの使用 複数メッセージをマージして処理の実行が可能 (異なるプロトコルからの入力メッセージのマージも可能) 個々のメッセージをDBに格納 入力メッセージをバイナリにしてデータベースに保存 特定の条件(キーを含むメッセージの受信など)に一致すると、DBに蓄積されたメッセージをマージして、 出力メッセージを作成 MQMD 処理結果2 複数の処理結果を1MQメッセージとして送信 MQMD 処理結果1 MQMD データベースに メッセージを保存 処理結果1 処理結果2 ・・・ キーを含むメッセージならば、 データベースからメッセージを 読み出して出力メッセージを生成 Application 特定キーを含むメッセージでなければ、 処理終了 Application 個々のメッセージをキューに格納 入力メッセージをキューに保存 特定の条件(キーを含むメッセージの受信など)に一致すると、キューに蓄積されたメッセージをマージして、 出力メッセージを作成 189 複数メッセージ単位での連携の実装例 グループ・メッセージを使用した実装 アプリケーションは関連するメッセージをグループ・メッセージとして送受信 メッセージ・フローで、グループ・メッセージを意識する必要がない場合 メッセージ・フローは個別のメッセージとして処理 一部のメッセージが(エラーなどで)欠落した場合は、受信側アプリケーションで検知 メッセージ・フローで、グループ・メッセージを意識する必要がある場合 メッセージ・フローはグループ単位で処理の整合性を維持 –関連する複数のメッセージを1つのUOWで処理 –グループ単位でメッセージを全てルーティング、またはエラー処理 MQInputノードの「メッセージ・グループによるコミット」をチェック –個々のメッセージではなく、グループの最終メッセージで処理をコミット Application Application ※グループ・メッセージのUOW処理では、エラー処理に考慮が必要(後述) 190 グループ・メッセージ使用時の考慮点(1) <参考> アプリケーションがグループ・メッセージとして送受信する必要がある MQMD.MsgId、CorrelIdなどでメッセージを関連付けている既存アプリケーションのときは、 グループ・メッセージへの変換/解除プログラムを作成して、配置する Application Application グループ・メッセージに変換 グループ・メッセージを解除 191 グループ・メッセージ使用時の考慮点(2) <参考> 実装の仕方によっては、グループとしての「UOW」が実装できない場合がある 「メッセージ・グループによるコミット」とは単にコミットのタイミングを制御するだけ 「グループのすべてのメッセージが正常処理される/エラー処理される」は制御外 –グループ・メッセージが正常処理の出力キューとエラー・キューに分かれる可能性がある Failureターミナルから エラー処理に接続 エラー・キュー 出力キュー 入力キュー Failureターミナルは「メッセージ・グループによるコミット」の制御対象外 Failureターミナルではグループ・メッセージでも1件ごとにコミットされてしまう 一部のメッセージがFailureターミナルから出力された後にブローカーがダウンすると、入力キューに中途半端なグ ループ・メッセージが残される.「すべてのメッセージが使用可能」がチェックされていると、ブローカーを再起動しても、 残されたメッセージは永遠に滞留. 【グループ・メッセージの一部に例外が発生した場合の流れ】 (入力キューの「バックアウトしきい値」が0のとき) 正常キューへ出力 1件目のMSG BACKOUTCOUNT = 0 2件目のMSG BACKOUTCOUNT = 0 例外発生 バックアウト 1件目のMSG BACKOUTCOUNT = 1 エラー・キューへ出力 2件目のMSG BACKOUTCOUNT = 1 エラー・キューへ出力 3件目のMSG BACKOUTCOUNT = 0 正常キューへ出力 コミット コミット コミット 192 グループ・メッセージ使用時の考慮点(2) <参考> 「グループ・メッセージとしてのUOW」の実装する方法 Failureターミナルを使用しない バックアウト回数をFilterノードで検査し、閾値を超えていたらエラー処理 グループ内の1つのメッセージがエラー処理されたら、残りのメッセージもエラー処理させる メッセージがエラー処理されたらデータベースにMQMD.GroupIdを保存 Filterノードで検査し、同じGroupIdであればエラー処理 GROUPMSG GROUPID(CHAR51) X'1234567890ABC ' グループで最初にエラー処理されるメッセージであれば MQMDのGroupIdを記録 参照 エラー・キュー False 入力キュー True 出力キュー メッセージのバックアウト回数と GroupIdを確認 193 グループ・メッセージ使用時の考慮点(3) <参考> 宛先キューがクラスター・キューの場合 フローはMQOO_BIND_AS_Q_DEFでキューをOPEN キュー属性がDEBIND(NOTFIXED)の場合、グループ・メッセージは分散されてしまう キュー属性がDEFBIND(OPEN)の場合、フローのMQOPENのタイミングをコントロールできないため、 グループ・メッセージ単位でのラウンド・ロビンはできない グループ・メッセージ単位にメッセージをラウンド・ロビンさせるには、 フローの後ろにルーティング・アプリケーションを配置 1グループの全メッセージを送信すると、BIND_ON_OPENでMQOPENを実行し宛先の再選択を行う ルーティング・アプリケーション loop1 MQOPEN with BIND_ON_OPEN loop2 MQGET MQPUT END loop2 END loop1 グループ・メッセージ Application Application Application クラスター・キュー グループ・メッセージをルーティングするた びに、宛先キューをBIND_ON_OPENで再オー プンし、宛先の再選択を行う 194 複数メッセージ単位での連携の実装例 ASBITSTREAM/CREATE FIELD PARSEを使用した実装 メッセージ・フローでメッセージの内容の関連性まで意識する場合 例.すべてのメッセージを参照しないと、宛先を決定できない など メッセージ・フローは、パースされているメッセージをバイナリにしてデータベースに保存 –ASBITSTREAM関数を利用 –可変長バイナリのカラムのテーブルを作成するだけで、フォーマットの異なるメッセージを保存可能 メッセージをすべて受信したら、テーブルからバイナリ・メッセージを取り出してパース –CREATE FIELD PARSE関数を利用 –パースに必要な情報(ドメイン、セット、タイプ、フォーマット)もテーブルに保存しておく データベースにメッセージを保存 Application 最終メッセージならば、データベースからバイナリ・メッセージを 読み出してパース.宛先を決定してルーティング 最終メッセージでなければ、 処理終了 Application 195 複数メッセージ単位での連携の実装 <参考> ASBITSTREAM関数の使用例 SET MSG_DOMAIN = FIELDNAME(Body); SET MSG_BLOB = ASBITSTREAM(Body ENCODING Root.MQMD.Encoding CCSID Root.MQMD.CodedCharSetId SET Root.Properties.MessageSet TYPE Root.Properties.MessageType FORMAT Root.Properties.MessageFormat); PASSTHRU('INSERT INTO MSG_TB VALUES(?, ?, ?, ?, ?, ?, ?)', MSG_BLOB, Root.MQMD.Encoding, Root.MQMD.CodedCharSetId, MSG_DOMAIN, Root.Properties.MessageSet, Root.Properties.MessageFormat, Root.Properties.MessageType); CREATE FIELD PARSE関数の使用例 SET Environment.Variables.TBL_DATA[] = PASSTHRU('SELECT * FROM MSG_BIN'); SET OutputRoot.MQMD.Encoding SET OutputRoot.MQMD.CodedCharSetId SET OutputRoot.Properties.MessageSet SET OutputRoot.Properties.MessageType SET OutputRoot.Properties.MessageFormat = Environment.Variables.TBL_DATA[1].ENCODING; = Environment.Variables.TBL_DATA[1].CCSID; = TRIM(Environment.Variables.TBL_DATA[1].MSGSET); = TRIM(Environment.Variables.TBL_DATA[1].MSGFORMAT); = TRIM(Environment.Variables.TBL_DATA[1].MSGTYPE); CASE TBL_DATA[1].DOMAIN WHEN ‘MRM’ THEN CREATE NEXTSIBLING OF OutputRoot.MQMD DOMAIN TRIM(Environment.Variables.TBL_DATA[1].DOMAIN) PARSE(Environment.Variables.TBL_DATA[1].DATA ENCODING Environment.Variables.TBL_DATA[1].ENCODING CCSID Environment.Variables.TBL_DATA[1].CCSID SET TRIM(Environment.Variables.TBL_DATA[1].MSGSET) TYPE TRIM(Environment.Variables.TBL_DATA[1].MSGFORMAT) FORMAT TRIM(Environment.Variables.TBL_DATA[1].MSGTYPE) ); 196 順序保障 メッセージ・フローを並列化することで、スループットの向上が可能 同一メッセージ・フローを複数実行グループ、複数インスタンスで実行 実行グループがプロセス、インスタンスがスレッドとして稼動 この場合、メッセージの順序性は保障されない メッセージの順序保障への対応 関連メッセージ内で順序保障が必要な場合 受信アプリケーションで順序保障が必要(フローでは順序保障は不要)なケース フロー内でも順序保障が必要なケース 全メッセージで順序保障が必要な場合 197 関連メッセージ内で順序保障 受信アプリケーションで順序保障が必要なケース(フロー内では順序保障不要) アプリケーションは、関連メッセージをグループ・メッセージとして送受信 フローは複数スレッドで実行し、グループ・メッセージは意識しない フロー内でも順序保障が必要なケース アプリケーションは、関連メッセージをグループ・メッセージとして送受信 フローは複数スレッドで実行し、グループ・メッセージを意識して受信 グループ・メッセージを意識した受信のための設定や考慮点は前述の通り メッセージ・フローはグループ・メッセージをまとめて受信するため、 フロー内でもメッセージの処理順序は保障される グループ・メッセージ Application Application 複数インスタンスで実行 198 全メッセージで順序保障 全メッセージで順序保障が必要な場合 メッセージ・フローを1実行グループ(プロセス)、1インスタンス(スレッド)で実行 入力キューの読み込みを排他制御 キュー属性の DEFSOPT(EXCL)、または NOSHARE を設定 –一時点の読み取りオープンを1つに限定 実行グループ異常終了時の追い越し回避の為 –メッセージのバックアウト完了後、「読み取りオープンの解除」を実施するため、追い越しは発生しない Application Application DEFSOPT(EXCL) または、 1スレッドで実行 NOSHARE CPUに余裕があってもフローを並列化できないため、スループットをあげられない -->対策は、後述 199 順序保障ロジックの作り込み <参考> 1スレッド実行による順序保障では、CPUに余裕があってもスループットを向上できない 全メッセージで順序保障が必要でもフロー内では順序保障しなくてよい場合は ⇒ フローの前後に順序保障ロジックを配置し、フローでの順序保障を不要にする ⇒ フローを複数インスタンスで実行し、スループット向上 メッセージ・フローへの入力前に、メッセージに順序番号を付与 メッセージ・フローは、複数インスタンスでメッセージを処理 メッセージ・フローからの出力後、メッセージの順序を回復してルーティング 順序保障ロジック メッセージに順序番号 を付与 順序保障ロジック 複数インスタンスで実行 Application メッセージの順序 を回復 Application 200 順序保障ロジックの作り込み 実装例 <参考> メッセージの順序番号付け、順序回復に、グループ・メッセージ機能を利用 メッセージ・フローを複数実行しているため、 フローではメッセージの処理順序は保障されない Application グループ・メッセージ (EXCLUSIVE) Loop ① MQのグループ・メッセージ で順序を回復 ・受信メッセージをグループ・メッセージにして送信 メッセージが無くなったら(MQRC_NO_MSG_AVAILABLE)、または、 一定数(10件など)のメッセージを送信したら、1つのグループ化は終了 ④ 順序保障ロジック ・MQMD.GroupIdをデータに入れてメッセージ送信 end-Loop ② 順序保障ロジック MQMD ③ GROUPID グループ順序制御キュー (EXCLUSIVE) Loop グループ順序制御キューより、メッセージを受信(グループIDを取得) Loop 該当グループ・メッセージを受信し、グループを解除して送信 end-Loop end-Loop ⑤ グループの順序は、MQのFIFOで保障 Application 処理順序を保障するために1スレッドで実行 201 順序保障ロジックの作り込み 実装例 <参考> ①前段の順序保障ロジックは、複数の受信メッセージをグループ・メッセージとして入力キューに送信 キューからメッセージがなくなるか(MQRC_NO_MESSAGE_AVAILABLE)、一定数のメッセージを送信したらグループ化を終了 ②グループ・メッセージ送信後、グループIDを付加したメッセージをグループ順序制御キューに送信 ③メッセージ・フローは、複数インスタンス(スレッド)で入力キューのグループ・メッセージを処理し、出力キューに送信 メッセージは、複数インスタンスで並列処理されるため、フロー内での順序性は保障されない ④受信アプリケーションは、グループ順序制御キューからメッセージを受信し、グループIDを取得 出力キューから該当グループに属するグループ・メッセージを受信することで、順序性を回復 ⑤受信したグループ・メッセージからグループを解除して送信 202 順序保障ロジックの作り込み 考慮点 <参考> 考慮点 フロー内でも順序保障が必要な場合はこの方法は使えない メッセージのグループ化/解除のためのCPUコスト、 MQPUT/MQGETの回数が増えるため、常にスループットが向上できるとは限らない (1)複数インスタンスで実行することで、メッセージ・フローのスループットが向上するか? メッセージ・フローがCPUバインドで、CPUに余裕がなければ、複数インスタンスで実行しても無駄 –・メッセージのグループ化/解除のためのコストを含めてもCPUに余裕があるか? (2)MQPUT/MQGETの回数が増えることで、MQのログI/Oが新たなボトルネックにならないか? パーシステント・メッセージを使用しているとき (1) 複数インスタンスで実行することで、スループットが向上しそうか? (2)MQPUT/MQGETの回数が増えることで、 MQのログI/Oがボトルネックにならないか? メッセージのグループ化 メッセージ・グループの解除 203 blank 204 汎用メッセージ・フロー 汎用的なメッセージ・フローのメリット 異なるメッセージ種別、処理種別のメッセージを同一のフローで処理 フロー数を抑えることで、少ないメモリ・リソースで稼動 メッセージフロー・インスタンス単位で、MQ、データベースに接続 フロー数やフローと紐づくMQキューの数を抑えるので、管理・監視が容易になる msg_A MQMD 共通ヘッダー アプリケーション・データ msg_B MQMD 共通ヘッダー アプリケーション・データ msg_C MQMD 共通ヘッダー アプリケーション・データ PUT禁止によって、特定のメッセージ種別、処理種別の処理を停止したければ、別名キューの定義が 必要 汎用的なメッセージ・フローの実装 共通ヘッダーを定義し、フォーマット識別IDや処理種別IDなどを持たせる MQInputノードでは共通ヘッダーのみパースし、ヘッダー内の識別IDにしたがって処理を分岐 RouteToLabelノードを使用 205 汎用メッセージ・フロー 複数メッセージ・フォーマットを処理する汎用フローの実装例 MQInputノードで共通ヘッダーのみフィールド・レベルまでパース、 アプリケーション・データは1フィールドの可変長バイナリとしてパース 共通ヘッダー内のメッセージ種別の情報に基づき、RouteToLable / Labelノードで処理を分岐 処理分岐後、ResetContentDescriptorでアプリケーション・データまで再パース、処理を実行 MQMD 共通ヘッダー 可変長バイナリ msg_A MQMD 共通ヘッダー アプリケーション・データ msg_B MQMD 206 共通ヘッダー アプリケーション・データ ResetContentDescriptorノード メッセージ・フローの途中でメッセージを再パース メッセージフローの途中で、ノードに設定されたメッセージ定義に基づいてメッセージを再パース BLOB -In -Failure -Out 主な設定プロパティ タブ 説明 説明 ノード名、ノードの説明 基本 メッセージをパースするための情報を設定 メッセージ・ドメイン、メッセージ・セット、メッセージ・タイプ、メッセージ形式など 設定したメッセージ定義を有効にするために「XXXXのリセット」をチェック 妥当性検査 妥当性検査を実施する場合に設定 207 blank 208 XML メッセージフローのネスティング メッセージフローの一部分を別のメッセージフロー(サブフロー)として作成可能 共通のエラー処理などをサブフロー化し、再利用可能な共通部品を作成 大きなメッセージフローを複数のサブフローに分けて開発 入力ノード/出力ノードがサブフローの入口点/出口点 作成したサブ・フローをメイン・フローにドラッグ & ドロップすると 1つのノードとして現れる サブ・フロー 209 メッセージフローのネスティング サブフロー内の入力/出力ノードは、上位のフローの中でノードのターミナルとして現れる ターミナル名は入力/出力ノードに付けた名前 「入力」 ターミナル サブ・フロー サブフロー内に配置できる入力/出力ノードの数に制約はない サブフロー内に複数の入力/出力ノードを配置可能 入力/出力ノードがないサブフローも作成可能 – 例:入口点がLabelノードになっているサブフロー ネスティングの階層数に制限はない 階層数を増やしすぎると、処理内容がわかりにくくなるので注意 210 「出力」 ターミナル メッセージフローのネスティング サブフローの利用例 大規模メッセージフローを複数ユーザーで並行開発 前述の「汎用メッセージフローの実装例」にサブフローを適用した例 サブフローとして作成 分担して、 並行開発可能 211 メッセージ・フローのネスティング プロパティのプロモート サブ・フロー内のノードのプロパティを上位のメッセージ・フローでカスタマイズできるようにする より汎用的なサブ・フローの作成が可能 ①サブ・フローを右クリック サブ・フローに配置してあるノードとプロパティの一覧 ②プロパティを選択して「プロモート」をクリック -> 「プロパティのプロモート」を選択 必要に応じてグループを作成 (上位のフローでノード・プロパティの「タブ」になる) 212 メッセージ・フローのネスティング プロモートされたプロパティがノードのプロパティとしてグループ化されて現れる 213 blank 214 プロセス・ノード間での情報の受け渡し 同一メッセージ・フロー内のプロセス・ノード間で情報の引き継ぎに、 LocalEnvironment、Environmentの2種類のツリーが使用可能 いくつかの標準提供プロセス・ノードでも情報の引継ぎにこれらのツリーを使用 MQOutputノードの「宛先リスト」が使用しているLocalEnvironment.Destination など ユーザー・データはVariablesフォルダーを作成して格納することを推奨(強制ではない) 標準提供プロセス・ノードが使用しているエレメントと名前の衝突を回避するため 情報の受け渡し例. 「ユーザー・エラーの検査とログ出力」 (1)Filterノードでメッセージを検査、 エラーを見つけたらEnvironment(、またはLocalEnvironment)にエラー情報をセットし、メッセージをFalseターミナルに出力 (2)TraceノードでEnvironment(、またはLocalEnvironment)のエラー情報をシステム・ログに出力 <FilterノードのESQL例> Traceノードで ファイルやシステム・ログにテキストを出力 IF xxxxxxx THEN SET Environment.Variables.ERR_NO = ‘USER001E’; SET Environment.Variables.ERR_REASON = ‘値が範囲外’; RETURN FALSE; END-IF; 215 プロセス・ノード間での情報の受け渡し 同一メッセージ・フロー、同一メッセージ処理のノード間で情報が受け渡せるだけ 異なるメッセージ・フロー・インスタンス間では情報を引き継げない – Environment(または、LocalEnvironment)に情報をセット メッセージ・フロー (インスタンス1) メッセージ・フロー (インスタンス2) Environment(または、LocalEnvironment)にセットされた情報を読み出す 異なるメッセージの処理間では情報を引き継げない n番目のメッセージの処理でEnvironment(または、LocalEnvironment)に情報をセット メッセージ・フロー n+1番目のメッセージの処理でEnvironment(または、LocalEnvironment)にセットされた情報を読み出す Environment、LocalEnvironmentツリーでの情報の受け渡しができないだけ. データベース、半パーシステント変数を使えば、上記の引継ぎは可能 216 プロセス・ノード間での情報の受け渡し EnvironmentとLocalEnvironmentツリーの違い Environmentツリーのインスタンスは、メッセージ・フローの処理が完全に終わるまで1つ LocalEnvironmentツリーは随所でコピーが作成される (1)Computeノード LocalEnvironmentツリーは、入力と出力のどちらのツリーを後続ノードに流すかを「計算モード」プロパティで選択 コピーを作成せず、入力ツリーを流す Environment ・出力ツリーが入力ツリーとは別に作成される ・出力ツリーに入力ツリーの情報のコピーが必要なら、 「SET OutputLocalEnvirnment = InputLocalEnvironment」が必要 LocalEnvironment どちらのツリーを後続ノードに流すかを「計算モード」プロパティで選択 LocalEnvironment 217 プロセス・ノード間での情報の受け渡し (2)Catchターミナルでの例外処理 LocalEnvironemntツリーに設定した情報は、Catchターミナルに引き継がれない LocalEnvironmentの更新は無効になっている catch LocalEnvironmentとEnvironmentの両方を更新 try 例外発生 正常フロー(Tryターミナル) コピーを作成せず、入力ツリーを流す Environment 入力ツリーをコピーして出力ツリーが作成される LocalEnvironment LocalEnvironment エラー処理フロー(Catchターミナル) 218 プロセス・ノード間での情報の受け渡し (3)PROPAGATE Environmentを使うと、後続ノードで設定した情報を前方のノードに引き継ぐことが可能 : PROPAGATE; : コピーを作成せず、入力ツリーを流す Environment 入力ツリーをコピーして出力ツリーが作成される LocalEnvironment LocalEnvironment Computeノードで作ったLocalEnvironemtツリーは、 後続ノードがなくなると削除 (PROPAGATEのオプションで変更可能) 219 半パーシステント変数(共有変数) 半パーシステント変数(共有変数) 複数のメッセージ処理に跨って存続可能な変数 最初のメッセージ処理時に変数を初期化 メッセージ・フローの再デプロイ、または、実行グループが終了するまで存続 半パーシステント変数は、同一メッセージ・フロー・インスタンス間で共有可能 ノード共有変数 : モジュール・レベルで宣言 – 同一メッセージ・フローの同一ノードだけで共有される変数 フロー共有変数 : スキーマ・レベルで宣言 –同一メッセージ・フローであれば異なるノードでも共有される変数 ※スキーマ・レベルで変数を宣言しても、異なるメッセージ・フローのインスタンスからは別の変数として扱われる --> 異なるメッセージ・フローでは共有できない 共有変数へのアクセスをシリアライズ化するESQL(BEGIN ATOMIC)を提供 ノード共有変数 DataFlowEngine Var01 フロー共有変数 Var01 DataFlowEngine Var01 同一メッセージ・フローの異なるインスタンス 同一メッセージ・フローの異なるインスタンス 220 Var01 異なるメッセージ・フロー 半パーシステント変数(共有変数) 半パーシステント変数の利用 DECLAREステートメントでSHAREDを指定して宣言 例.メッセージ・フローが処理したメッセージ件数をカウント スキーマ・レベルで宣言したので、フロー共有変数 DECLARE msg_cnt SHARED INTEGER 0; CREATE COMPUTE MODULE semi_persistent_Compute (この位置で変数を宣言すれば、ノード共有変数) CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN BEGIN ATOMIC SET msg_cnt = msg_cnt + 1; END; BEGIN ATOMIC ~ ENDで囲まれた部分は、 複数インスタンス(スレッド)で処理してもシリアライズ実行 CALL CopyMessageHeaders(); : 221 半パーシステント変数(共有変数) ROW変数と組み合わせればテーブルのキャッシュが可能 メモリ上に読み込んだテーブルを参照して高速に処理を行う 例.テーブル・キャシュ DECLARE tb_cache SHARED ROW ; DECLARE init_flg SHARED BOOLEAN FALSE; CREATE COMPUTE MODULE row_variables_Compute CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN BEGIN ATOMIC IF init_flg = FALSE THEN SET tb_chache.RECORD[] = SELECT * FROM Database.TABLE01; SET init_flg = TRUE; END IF; END; COL1 COL2 X CALL CopyMessageHeaders(); : RECORD[1] COL1 222 COL2 ・・・・ RECORD[n] 実行時セキュリティ メッセージフロー実行時のセキュリティ管理が可能 メッセージ内のID情報を元に、メッセージ単位にフロー実行のための認証/認可やIDのマップを行う セキュリティ・マネージャーが外部セキュリティ・プロバイダーに問い合わせてチェックを行う ブローカーが持つセキュリティ・プロファイルに基づいて、問合せ先を選択 入力ノードでセキュリティ・チェックに利用するID情報を設定 セキュリティ情報はメッセージツリーに展開されるので、後続のロジックで参照可能 出力メッセージにセキュリティ情報を伝播 入力メッセージのオリジナルのID情報、またはマップしたID情報を伝播 セキュリティ情報はメッセージツリーのPropertiesに格納 MQ HTTP(S) SOAP MQ HTTP(S) SOAP 認証/認可/IDのマップ IDの利用 IDの伝播 セキュリティ・マネージャー キャッシュ 外部セキュリティプロバイダー 認証 マップ 認可 LDAP TFIM TFIM LDAP TFIM Security Profiles ブローカーが保管 外部セキュリティ・プロバイダー ・LDAP:Lightweight Directory Access Protocol ・TFIM:IBM Tivoli federated Identity Manager 223 サポートするセキュリティ・プロバイダー Lightweight Directory Access Protocol(LDAP):認証、認可 認証、認可のセキュリティ・チェックが可能 LDAP v3 サーバーが前提 IBM Tivoli Directory Server Microsoft Active Directory OpenLDAP サポートするトークンのタイプ ユーザ名 ユーザ名+パスワード 224 サポートするセキュリティ・プロバイダー IBM Tivoli Federated Identity Manager(TFIM):認証、マッピング、認可 認証、認可のセキュリティ・チェックとIDマップが可能 TFIM 6.1 が前提 サポートするトークンのタイプ ユーザ名 ユーザ名+パスワード X.509形式の証明書 代替IDのマップ方法 ユーザ名 Æ ユーザ名 X.509形式の証明書Æ ユーザ名 ブローカーをPEP(Policy Enforcement Point)として使用 複数セキュリティ・ドメイン環境でシングル・サインオンを実現 PDP(Policy Decision Point)、PolicyRepository ログイン USER_A PASSWD_A システム セキュリティ・ドメインA セキュリティ・ドメインB PEP USER_1 PASSWD_1 ブローカー USER_A PASSWD_A システム セキュリティ・トークンのマッピング USER_A PASSWD_A USER_1 PASSWD_1 225 実行時セキュリティの設定方法 設定手順 セキュリティ・プロファイルの作成 認証/認可/マップ/マップ後のユーザID伝播を行うかどうかを設定 利用する外部プロバイダーにアクセスするための設定 ブローカーにSecurityProfilesサービスとして作成 セキュリティ・プロファイル・エディターまたは、mqsicreateconfigurableservice コマンドを提供 ドメインビューから起動 ブローカーを右クリック Æセキュリティ・プロファイルのオープン 226 実行時セキュリティの設定方法 入力ノードの設定 セキュリティ・トークンのタイプを指定する(ユーザ名、ユーザ名+パスワード、X.509証明書) セキュリティ・トークンとして使用する入力メッセージ内のフィールド情報を指定 ”セキュリティ“タブで設定 例外をキャッチしたい場合は、チェックする ※デフォルトは例外として扱わない ディプロイメント・ディスクリプタの設定 実行時セキュリティ・チェックを行うかどうかを指定 セキュリティ・チェックを行う場合は、使用するセキュリティ・プロファイル名を指定 メッセージフロー単位、または入力/出力ノード単位で指定 227 実行時セキュリティの設定方法 <参考> セキュリティ・プロファイル設定に関連するコマンド セキュリティ・プロファイルの作成 プロパティ名、値を個々に指定する mqsicreateconfigurableservice ブローカー名 –c SecurityProfiles –o プロファイル名 –n プロパティ名 –v プロパティ値 コマンド実行例 mqsicreateconfigurableservice BK1 –c SecurityProfiles –o MYSECURITY –n authentication –v LDAP セキュリティ・プロファイルの変更 mqsichangeconfigurableservice ブローカー名 –c SecurityProfiles –o プロファイル名 –n プロパティ名 –v プロパティ値 セキュリティ・プロファイルの削除 mqsideleteconfigurableservice ブローカー名 –c SecurityProfiles –o プロファイル名 セキュリティ・プロファイルの参照 mqsireportproperties ブローカー名 –c SecurityProfiles –o プロファイル名 -r mqsireportproperties ブローカー名 –c SecurityProfiles –o AllReportableEntityNames -r 228