WebSphere MQ: トリガリング (1) TRIGGER属性, runmqtrmコマンド

WebShpere MQのトリガリング機能の動作確認。前回までの記事はこちら。参考サイト・ドキュメントは記事の末尾をご参照。

トリガリングとは

下記のドキュメントが簡単に纏まっていたので引用させて頂く。
引用元:WebSphere MQ System Administration Guide Version 7.0

WebSphere MQ enables you to start an application automatically when certain conditions on a queue are met. For example, you might want to start an application when the number of messages on a queue reaches a specified number. This facility is called triggering and is described in detail in the WebSphere MQ Application Programming Guide.

簡単に言えばイベント(メッセージ)ドリブンな処理を実現できる機能。

トリガリングの構成コンポーネント

下記画像はクリックすると拡大します。
websphere_mq_trigger
上図の()括弧は補足説明。[]括弧は今記事でサンプルとして定義する名称。6つのコンポーネントに追加で一時動的Reply-toキューをモデル・キューとして定義しトリガリングの動作を確認する。

検証プログラム

使用サンプルプログラムは下記の2つ。

amqsreq – /opt/mqm/samp/amqsreq0.c

ソースの冒頭のコメントを参照。簡単に言うと、標準入力から入力されたメッセージ行を対象キューにMQPUTし、空行が入力されると、Reply-toキューからメッセージをMQGETし標準出力する。上図のユーザー・プログラムAの役割。Reply-toキューを図に記載しなかったのはトリガー構成から趣旨がずれてしまう為。
書式:amqsreq <対象キュー> <キュー・マネージャー> <Reply-toキュー>

amqsech – /opt/mqm/samp/amqsecha.c

プロンプトから起動するのではなく、トリガー・モニターよりトリガー・メッセージ(構造体)をパラメーターとして起動。構造体内で指定されているキューからメッセージをMQGETし、そのメッセージ記述子に指定されたReply-toキューにそのメッセージのコピーをMQPUTする。これを対象のキューに残っているメッセージそれぞれに対して処理し、キューが空になったら、MQCLOSEする。上図のユーザー・プログラムBの役割。
詳細はソースに記載のコメントを参照。

トリガリング用のキュー・マネージャー構成

検証用のオブジェクトの作成スクリプトは下記のようになる。

簡単に上図との対応を記載すると、

  • イニシエーション・キュー:QL.INITQ (下記QL.AのINITQパラメーターで指定、参照される。)
  • アプリケーション・キュー:QL.A (TRIGGERを指定する事でトリガリング機能を有効にする。またTRIGTYPE(FIRST)はキューが空の状態からメッセージが1つPUTされた時にトリガー・イベントが発生する。)
  • プロセス・オブジェクト:トリガー起動対象プログラムはamqsech。QL.Aに指定、参照される。
  • Reply-toキュー:図には無いがamqsreq, amqsechが使用するキュー。モデル・キューとして定義。アプリケーションよりMQOPENされるとキュー・マネージャーによって動的にキューが作成される。

runmqscの実行結果

トリガー・モニターの起動 – runmqtrm

WebSphere MQ (Windows, UNIX)に提供されているトリガー・モニターの内、runmqtrmを用いる。
書式:runmqtrm -m QMgrName -q InitiationQName
仮にイニシエーション・キューを指定しなかった場合はSYSTEM.DEFAULT.INITIATION.QUEUEが使用される。

トリガリングのテスト

メッセージのPUT

“Hello MQ world!”、”Hello”、”Hello”メッセージがQL.AにMQPUTされ、空行の後にQM.REPLYキューよりamqsechがMQPUTしたメッセージをMQGETできている。その時のトリガー・モニターの状況は下記の通り。

トリガー・モニター

スペースが多いのはメッセージ構造体に指定されていないパラメータが多い為。

トリガー・メッセージが2つに区切られているのは、1件目のMQGET後、5秒間(WaitIntervalで指定された時間)後、何もメッセーがPUT為れなかった為、MQGETがrc 2033(MQRC_NO_MSG_AVAILABLE)を返して終了したが、2, 3件目の間は5秒以内だった為、続けて”Hello”, “Hello”とMQGETした。このWaitIntervalの設定はソース中のGetMsgOpts構造体で設定している。
3件目のputの際は、直前にamqsechがgetしているので再度トリガーイベントが発生しamqsechが2重起動しそうな気がしたが、まだ、amqsechがMQOPEN中でWaitしている状態の為、イベントが発生しなかったのかな。

尚、トリガー機能を停止したい場合はキューに対してNOTRIGGERパラメーターを設定する。

参考ドキュメント

  • WebSphere MQ Application Programming Guide Version 7.0
  • WebSphere MQ System Administration Guide Version 7.0

ちなみに、runmqtrmはiSeries(IBM i)版には無いらしい。。。