【IDM】MSMQ を使って確実なユーザー登録を行う その5 ~ メッセージの中身を読み取る

いまさらですが、「忘れられた日本人」という本がおもしろくてたまりません。民俗学なんて高尚な話はひとまずおいといても、面白いです。そして思うことは、はたして自分が80歳になったとき、人に語って聞かせる話を持っているだろうか...Message Queue の話をする老人はやだなぁ。

ということで、MSMQを使ってユーザー登録するシリーズです。

前回までの投稿は以下の通りです。

前回はCSVファイルから読み取ったレコードをメッセージとしてキューに登録する手順について書きました。

今回は、キューに登録されたメッセージを読み取る方法と、メッセージを別のキューに移動する方法について解説いたします。

ここで、全体の流れをおさらいしておきます。

① CSVファイル から MSMQの[Inputキュー]に登録 ↓ ② トリガーが起動しルールが適用される └ キューからメッセージを読み取ってADにユーザー登録 └┬ 成功したらメッセージは廃棄 └ 失敗したらメッセージを [Errorキュー] に移動 ↓ ③ [Errorキュー] に格納されているメッセージを定期的に[Inputキュー]に移動

① については前回解説しました。

今回は、② について解説します。

CSVファイルからInputキューにメッセージが登録されると、メッセージ1件の登録につき1回、トリガーが起動します。

トリガーには「ルール」が関連付けられており、「ルール」には実行するスクリプトを関連付けておきます。

模式的に書けばこんな感じです。

[キュー]-[トリガー]-[ルール]
└ 実行するスクリプト

このあたりの解説は、以下に書かれていますので、もし忘れてしまった方はおさらいしてくださいませ。

【IDM】MSMQ を使って確実なユーザー登録を行う その3 ~ MSMQ の環境設定

今回作成するスクリプトは、ルールに関連づけられるスクリプトですが、ひとまず一般的なスクリプトを作りましょう。ルール用の微調整はあとから行うことにします。

■キューからメッセージを読み取る

キューからメッセージを読み取るには、Peek もしくは Receive を使用します。ただし、Peek の場合には読んだ後のメッセージはそのままですが、Receiveではキューからメッセージが取り出されるため、結果としてキューから削除されます。

さて、今回はどちらがよいでしょう。

もちろん、Receive がよいのです。

成功しても失敗しても、メッセージは Inputキューから一旦削除しなければなりませんから、最初から Receive で受け取った方が効率的です。

なお、Receive の方法は1通りではなく、いくつか用意されています。関連するメソッドを以下に羅列します。それぞれが何をするかは見ての通りですね(といって面倒な解説を避けるのがライターの常套手段だったりもします....笑)。

今回使用するのは Receive メソッドです。これは、常に最も古いメッセージを受信します。もちろん、受信したあとはメッセージは削除されますから、次に Receive するときには2番目に古いメッセージを受信することになります。

以下は、InputキューからReceiveでメッセージを受け取るスクリプトです。

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Const MQ_RECEIVE_ACCESS  = 1  Const MQ_SEND_ACCESS     = 2  Const MQ_PEEK_ACCESS     = 32  Const MQ_ADMIN_ACCESS    = 128 Const MQ_DENY_NONE           = 0  Const MQ_DENY_RECEIVE_SHARE  = 1  set objQueueInfo_Input = CreateObject("MSMQ.MSMQQueueInfo") set objMsgQueue_Src = CreateObject("MSMQ.MSMQQueue") set objMessage = CreateObject("MSMQ.MSMQMessage") set objManagement = CreateObject("MSMQ.MSMQManagement") objManagement.Init "Junichia03",,"DIRECT=OS:junichia03\private$\Input" objQueueInfo_Input.Formatname = "DIRECT=OS:junichia03\private$\Input" Set objMsgQueue_Src  = objQueueInfo_Input.Open(MQ_Receive_ACCESS ,MQ_DENY_NONE) If objManagement.MessageCount > 0 then      wscript.echo objManagement.MessageCount & " 件のメッセージがあります"       Set objMessage = objMsgQueue_Src.Receive()      arrBody = Split(objMessage.Body,",")     strUserName = arrBody(0)     strPassword = arrBody(1)     strHomeDir  = arrBody(2)      Wscript.Echo "ユーザー名:" & strUserName     Wscript.Echo "パスワード:" & strPassword     Wscript.Echo "ホームパス:" & strHomeDir Else      Wscript.echo "メッセージがありません" End If

簡単に解説します。

11行目 MSMQ.MSMQManagement は、キューのステータスを参照するためのオブジェクトです。このスクリプトでは、キューに格納されているメッセージの数を参照するために使用しています。ここで作成したインスタンスを使用して、13行目では参照したいキューを指定し、18行目でメッセージ数を取得しています。

19行目 メッセージを受信しているのがこの行です。Receiveを使用しています。取得したメッセージはMSMQ.MSMQMessage 形式になります。
20行目ではメッセージのBODYプロパティを使用してメッセージの内容を取り出し、Splitで分割しています。

このスクリプトを実行した結果例が以下になります。

Receive

最初に前回使用したスクリプトを使用してCSVからキューにメッセージを登録しています。

次に、上のスクリプトを ReceiveInputQueue.vbs という名前で保存して実行しています。1回実行すると、キューの中の一番古いメッセージが取り出され、キューから削除されます。

プロンプト上に残りメッセージ数を表示しているので注意してみてください。

2回目の実行では、残りメッセージが減っていることがわかります。

長くなってしまったので、次の投稿でADへの登録を組み込みます。