...

メッセージ・フローの開発 目次 メッセージ・フローの開発手順 主要なプロセス・ノード

by user

on
Category: Documents
294

views

Report

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
Fly UP