もう金曜の夜か。一週間が速すぎます。
「MSMQ を使って確実なユーザー登録を行う」シリーズの3回目です。
今回は、MSMQ上にテスト的なキューを作成してみましょう。
その前に、簡単に MSMQの動きについてお話ししておきます。ただし、今回の目的達成のために必要最小限のお話しかしません(できないというはなしも...)。もっと詳しく知りたい!という方は、MSDNサイトをご覧ください。
What's new in Message Queueing 4.0(ごめんなさい、英語です)http://msdn.microsoft.com/en-us/library/ms701784(VS.85).aspx Windows Server 2008 テクニカルライブラリ メッセージキューサービス(ごめんなさい英語です、が、機械翻訳もつきます)http://www.microsoft.com/japan/technet/windowsserver/2008/library/0a1551a3-f169-4aaa-b486-e8c66f1a3d91.mspx Message Queueing COM Components (英語、Windows Script からアクセスする際には必見)http://msdn.microsoft.com/en-us/library/ms704064(VS.85).aspx
What's new in Message Queueing 4.0(ごめんなさい、英語です)http://msdn.microsoft.com/en-us/library/ms701784(VS.85).aspx
Windows Server 2008 テクニカルライブラリ メッセージキューサービス(ごめんなさい英語です、が、機械翻訳もつきます)http://www.microsoft.com/japan/technet/windowsserver/2008/library/0a1551a3-f169-4aaa-b486-e8c66f1a3d91.mspx
Message Queueing COM Components (英語、Windows Script からアクセスする際には必見)http://msdn.microsoft.com/en-us/library/ms704064(VS.85).aspx
Microsoft Message Queueing(日本語)(2008/Vistaの最新情報は含まれていません)http://msdn.microsoft.com/ja-jp/library/bb970313.aspx
メッセージキュー SDKドキュメント(日本語)(2008/Vistaの最新情報は含まれていません)http://msdn.microsoft.com/ja-jp/library/cc448132.aspx
では、以下の図をご覧ください。
クリックで拡大
アプリケーションから投入されたメッセージは、MSMQ上に作成したキューに一旦格納されます。
キューにメッセージが格納されたタイミングで自動的にプログラムを実行させるには、キューを監視するプログラムを常駐させておくことも可能ですが、IT pro 的には「トリガー」を作成しておくと便利でしょう。トリガーには、メッセージを振り分けるための「条件」と、振り分けられたメッセージに対する処理である「操作」を指定することができます。
キューには 複数のトリガー を割り当てることもできますし、一つのトリガーに 複数のルール、1つのルールに 複数の条件+操作 を割り当てることも可能です。
キューに格納されたメッセージは、はじめにルールに定義された条件に合致するかどうかがチェックされます。条件はメッセージの送信元やラベル、本文等を使用して定義することができ、それぞれのルールには1つの「操作」、つまりプログラムを指定することができます。
では、実際にMSMQにキュー、トリガー、ルールを作成してみます。
キューの作成
Windows Server 2008 の場合、MSMQをインストールするとサーバーマネージャ の「機能」に「メッセージキュー」ノードが表示されます。 メッセージキュー ノードを展開し、「専用キュー」を右クリックして[新規作成] - [専用キュー] を選択してください。 クリックして拡大 「新しい専用キュー」ウィンドウが表示されるので、キューの名前を入力してください。ここでは、「Input」としました。キューに対する処理はトランザクションを使用することも可能ですが、ひとまず今回はチェックせずに進みます。 クリックして拡大 これでキューの作成は完了です。専用キュー配下に、Inputキューが作成されていることを確認してください。 クリックして拡大
Windows Server 2008 の場合、MSMQをインストールするとサーバーマネージャ の「機能」に「メッセージキュー」ノードが表示されます。
メッセージキュー ノードを展開し、「専用キュー」を右クリックして[新規作成] - [専用キュー] を選択してください。
クリックして拡大
「新しい専用キュー」ウィンドウが表示されるので、キューの名前を入力してください。ここでは、「Input」としました。キューに対する処理はトランザクションを使用することも可能ですが、ひとまず今回はチェックせずに進みます。
これでキューの作成は完了です。専用キュー配下に、Inputキューが作成されていることを確認してください。
ルールを作成する
ルールを作成するにあたり、ルールに合致したメッセージを受信したときに実行するプログラムを作っておきます。といっても、たいそうなものである必要はありません。以下のようなコマンドを実行するバッチファイルで十分です。以下では、バッチファイルに渡された6つの引数を、c:\tmp\msmqtest.log というログファイルに保存しています。バッチファイル名を Input.bat として保存することにします。 echo %1 %2 %3 %4 %5 %6 >>c:\tmp\msmqtest.log 次にルール(規則)を作成します。メッセージキュー ノードの「トリガー」を展開し、「規則」を右クリックして表示されるコンテキストメニューから[新規作成] - [規則] をクリックしてください。 クリックして拡大 まずは規則名を入力します。ここでは、「rule1」としました。 クリックして拡大 次に規則の条件を指定します。ここで指定した条件に合致したメッセージのみが、この後の「操作」の対象となります。 今回は、以下のように設定してみます。
ルールを作成するにあたり、ルールに合致したメッセージを受信したときに実行するプログラムを作っておきます。といっても、たいそうなものである必要はありません。以下のようなコマンドを実行するバッチファイルで十分です。以下では、バッチファイルに渡された6つの引数を、c:\tmp\msmqtest.log というログファイルに保存しています。バッチファイル名を Input.bat として保存することにします。
echo %1 %2 %3 %4 %5 %6 >>c:\tmp\msmqtest.log
次にルール(規則)を作成します。メッセージキュー ノードの「トリガー」を展開し、「規則」を右クリックして表示されるコンテキストメニューから[新規作成] - [規則] をクリックしてください。
まずは規則名を入力します。ここでは、「rule1」としました。
次に規則の条件を指定します。ここで指定した条件に合致したメッセージのみが、この後の「操作」の対象となります。
今回は、以下のように設定してみます。
クリックして拡大 次に、メッセージが条件に一致した場合の操作を指定します。操作には、COMコンポーネントを指定する方法と実行可能ファイルを指定する方法が用意されています。今回は、「スタンドアロン実行可能ファイルの起動」を選択し、実行可能ファイルのパスとして、先ほど作成したバッチファイル( input.bat )を指定します。以下の例では、c:\tmp\input.bat を指定しました。 バッチファイルを指定したら、[パラメータ] をクリックしてください。 クリックして拡大 パラメータの指定画面では、メッセージのさまざまな属性を、バッチファイルの引数として指定することができます。今回、バッチファイルでは %1 から %6 までの 6 つの引数を受け取れるようにしたので、この画面でも 6 つのパラメータを指定することにします。以下のように指定してみてください(ひとまず、適当で結構ですし、6 つに足りなくても大丈夫です)。 クリックして拡大 以上でルールの作成は完了しました。
次に、メッセージが条件に一致した場合の操作を指定します。操作には、COMコンポーネントを指定する方法と実行可能ファイルを指定する方法が用意されています。今回は、「スタンドアロン実行可能ファイルの起動」を選択し、実行可能ファイルのパスとして、先ほど作成したバッチファイル( input.bat )を指定します。以下の例では、c:\tmp\input.bat を指定しました。
バッチファイルを指定したら、[パラメータ] をクリックしてください。
パラメータの指定画面では、メッセージのさまざまな属性を、バッチファイルの引数として指定することができます。今回、バッチファイルでは %1 から %6 までの 6 つの引数を受け取れるようにしたので、この画面でも 6 つのパラメータを指定することにします。以下のように指定してみてください(ひとまず、適当で結構ですし、6 つに足りなくても大丈夫です)。
以上でルールの作成は完了しました。
トリガーの作成
最後にトリガーを作成します。 先ほど作成した Input キューを展開し、[トリガー] を右クリックして表示されるコンテキストメニューから [新規作成] - [トリガ] をクリックしてください。 クリックして拡大 新しいトリガ画面が起動したら、トリガ名を指定し、「シリアル化」をチェックしてください。「シリアル化」とは、メッセージが入力された順番に処理することです。この場合、1つのメッセージの処理に時間がかかっていても次のメッセージを非同期に実行せず、処理完了まで待つことになります。シリアル化するかどうかは処理内容による判断が必要ですが、ID管理の場合、シーケンシャルでないと不都合が出ることが考えられるため、シリアル化をチェックしておきます。 また、以下の画面では「メッセージの処理の種類」として「ピーク」が選択されていることがわかります。「ピーク(PEEK)」とは単語の意味のとおり、「覗き見る」ことです。メッセージを受信したら中身の確認だけを行って、メッセージはそのままにしておきます。「取得(レシーブ)」してしまうと、フィルタチェック後にメッセージは削除されてしまうことに注意してください。処理が正常に完了せずに削除されてしまうと、もうやり直しがきかなくなってしまいます。 トリガの処理を詳しく知るには、以下のサイトをごらんください。日本語で平易に説明されています。 着信メッセージの読み取りhttp://msdn.microsoft.com/ja-jp/library/cc446859.aspx シリアル化トリガと非シリアル化トリガhttp://msdn.microsoft.com/ja-jp/library/cc446863.aspx クリックして拡大 次に、トリガに関連付ける ルール(規則)を選択します。先ほど作成した rule1 を 「適用される規則」に移動してください。複数のルールを適用することも可能です。 クリックして拡大 以上でトリガの設定は完了です。 ためしに、以下のスクリプトを拡張子 vbs で保存してローカルコンピュータ上から実行してみてください。 ※ junichia03 はコンピュータ名ですので、みなさんのコンピュータ名に置き換えてください Const MQ_RECEIVE_ACCESS = 1 Const MQ_SEND_ACCESS = 2 Const MQ_PEEK_ACCESS = 32 Const MQ_ADMIN_ACCESS = 128Const MQ_DENY_NONE = 0 Const MQ_DENY_RECEIVE_SHARE = 1 set objQueueInfo = CreateObject("MSMQ.MSMQQueueInfo")set objMsgQueue = CreateObject("MSMQ.MSMQQueue")set objMessage = CreateObject("MSMQ.MSMQMessage") objQueueInfo.PathName = "junichia03\private$\Input" 'objQueueInfo.Formatname = "DIRECT=OS:junichia03\private$\Input"'objQueueInfo.Formatname = "DIRECT=HTTP://junichia03/msmq/private$\Input" set objDist = objQueueInfo.Open(MQ_SEND_ACCESS ,MQ_DENY_NONE) objMessage.Label = "msg" & date & timeobjMessage.Body = "メッセージボディ"objMessage.Delivery = 1objMessage.Send(objDist) objDist.Close
最後にトリガーを作成します。
先ほど作成した Input キューを展開し、[トリガー] を右クリックして表示されるコンテキストメニューから [新規作成] - [トリガ] をクリックしてください。
新しいトリガ画面が起動したら、トリガ名を指定し、「シリアル化」をチェックしてください。「シリアル化」とは、メッセージが入力された順番に処理することです。この場合、1つのメッセージの処理に時間がかかっていても次のメッセージを非同期に実行せず、処理完了まで待つことになります。シリアル化するかどうかは処理内容による判断が必要ですが、ID管理の場合、シーケンシャルでないと不都合が出ることが考えられるため、シリアル化をチェックしておきます。
また、以下の画面では「メッセージの処理の種類」として「ピーク」が選択されていることがわかります。「ピーク(PEEK)」とは単語の意味のとおり、「覗き見る」ことです。メッセージを受信したら中身の確認だけを行って、メッセージはそのままにしておきます。「取得(レシーブ)」してしまうと、フィルタチェック後にメッセージは削除されてしまうことに注意してください。処理が正常に完了せずに削除されてしまうと、もうやり直しがきかなくなってしまいます。
トリガの処理を詳しく知るには、以下のサイトをごらんください。日本語で平易に説明されています。
着信メッセージの読み取りhttp://msdn.microsoft.com/ja-jp/library/cc446859.aspx シリアル化トリガと非シリアル化トリガhttp://msdn.microsoft.com/ja-jp/library/cc446863.aspx
着信メッセージの読み取りhttp://msdn.microsoft.com/ja-jp/library/cc446859.aspx
シリアル化トリガと非シリアル化トリガhttp://msdn.microsoft.com/ja-jp/library/cc446863.aspx
次に、トリガに関連付ける ルール(規則)を選択します。先ほど作成した rule1 を 「適用される規則」に移動してください。複数のルールを適用することも可能です。
以上でトリガの設定は完了です。
ためしに、以下のスクリプトを拡張子 vbs で保存してローカルコンピュータ上から実行してみてください。
※ junichia03 はコンピュータ名ですので、みなさんのコンピュータ名に置き換えてください
Const MQ_RECEIVE_ACCESS = 1 Const MQ_SEND_ACCESS = 2 Const MQ_PEEK_ACCESS = 32 Const MQ_ADMIN_ACCESS = 128Const MQ_DENY_NONE = 0 Const MQ_DENY_RECEIVE_SHARE = 1
set objQueueInfo = CreateObject("MSMQ.MSMQQueueInfo")set objMsgQueue = CreateObject("MSMQ.MSMQQueue")set objMessage = CreateObject("MSMQ.MSMQMessage")
objQueueInfo.PathName = "junichia03\private$\Input"
'objQueueInfo.Formatname = "DIRECT=OS:junichia03\private$\Input"'objQueueInfo.Formatname = "DIRECT=HTTP://junichia03/msmq/private$\Input"
set objDist = objQueueInfo.Open(MQ_SEND_ACCESS ,MQ_DENY_NONE)
objMessage.Label = "msg" & date & timeobjMessage.Body = "メッセージボディ"objMessage.Delivery = 1objMessage.Send(objDist)
objDist.Close
スクリプトの実行後、キューメッセージをリフレッシュすると、送信されたメッセージが登録されているはずです。 クリックして拡大 次回は、スクリプトを使用してもう少しテストをしてみましょう。
スクリプトの実行後、キューメッセージをリフレッシュすると、送信されたメッセージが登録されているはずです。
次回は、スクリプトを使用してもう少しテストをしてみましょう。
MSMQを使用してユーザー登録を工夫しようシリーズの第4回目です。 前回の登録から..なんと半年...Tech・Ed 2008 では「続き待ってます」と言われておりました...すみませんです。他にも書きかけの記事があったりもして...えーと、えーと、干支が変わる前になんとかしたいかなぁと思う今日この頃です(あ、なんか今日
いまさらですが、「忘れられた日本人」という本がおもしろくてたまりません。民俗学なんて高尚な話はひとまずおいといても、面白いです。そして思うことは、はたして自分が80歳になったとき、人に語って聞かせる話を持っているだろうか...Message
MSMQでユーザーを登録するシリーズです。もうすこしで完結します。 【IDM】MSMQ を使って確実なユーザー登録を行う その1 ~ MSMQ って何してくれるの? 【IDM】MSMQ を使って確実なユーザー登録を行う
明日23日が休みだってことに、いま気付きました。 MSMQでユーザー登録シリーズです。で、すいません。最終回じゃないです。 【IDM】MSMQ を使って確実なユーザー登録を行う その1 ~ MSMQ って何してくれるの?
さてもう一息ですね。第8回です。 #これまでの投稿一覧はこの投稿の最下段に書いておきます。 前回 作成したスクリプトをキューのルールとして登録する前に、MSMQ運用に必要な知識について書いておきます。知識というよりも、クセですね。
今年の営業日も残り少なくなってきました。私がいるオフィスも、心なしか人が少ないような...いや確実に少ない。みなさん、年末年始は休めそうですか?私は...うーん...びみょーです。 #これまでの投稿一覧は、この投稿の最下段に掲載してあります。
4/2 Windows Server 管理の自動化セミナー 基本編+応用編1 で使用したスクリプト 【IDM】MSMQ を使って確実なユーザー登録を行う その1 ~ MSMQ って何してくれるの? 【IDM】MSMQ