キューの作成
アプリケーションが起動すると、キューが作成されます(リスト2)。サンプルでは送信用、返信用の2本のキューを利用しますが処理に違いはないので、片方を取り上げて説明します。
// (1)キュークライアントの作成 var client = azure.createQueueService( azure.ServiceClient.DEVSTORE_STORAGE_ACCOUNT, azure.ServiceClient.DEVSTORE_STORAGE_ACCESS_KEY, azure.ServiceClient.DEVSTORE_QUEUE_HOST); //(2)キューの作成 client.createQueueIfNotExists(SEND, function(err, queueCreated) { ... });
(1)はキュー用のクライアントの作成をしています。使用するメソッドと引数が多少異なるだけで前回のBLOB用クライアント作成と変わりありません。
(2)のcreateQueueIfNotExistメソッドでキューを作成します。第1引数に作成したいキュー名を指定し、第2引数にはコールバック関数を指定します。キューの有無に関わらずコールバック関数は呼び出されます。キューが存在せずに新規に作られた場合は、コールバック関数の第2引数がtrueに設定されることで処理を切り分けることができます。
メッセージの追加
メッセージを入力し、[送信]ボタンをクリックすると、キューへメッセージを追加します(リスト3)。
exports.addMessage = function(req, res){ // (1)POSTデータからメッセージを取得 var message = req.body.message; // (2)メッセージの追加 client.createMessage(SEND, message, function(err) { res.end(); }); };
(1)はPOSTデータからメッセージを取得しています。(2)のcreateMessageメソッドで受け取ったメッセージを送信用キューに追加しています。第1引数にはキュー名を、第2引数にはメッセージを、第3引数にはコールバック関数をそれぞれ指定します。
キューへ送信できるメッセージの最大サイズは64KBで、キューに保存される有効期間は最大7日間です。有効期間内に取得されないメッセージは削除されます。
メッセージの取得と削除
メッセージの取得はワーカーロール側で行います。Node.jsにおけるワーカーロールの構造はリスト4のとおりです。
C: └─WorkerRole1 node.cmd …(node.exeを起動するバッチファイル) node.exe …(node.exe本体) server.js …(起動スクリプト) setup_worker.cmd …(セットアップ用バッチファイル)
Webロールの場合、node.exeはIISによってホスティングされますが、ワーカーロールの場合はスタートアップタスクから直接起動されます。このためWebSocketのようにIISがサポートしていない通信を直接行いたい場合や、Webロールとは別ロールでタスクを処理したい場合などにワーカーロールが利用できます。
さて送信キューに追加されたメッセージは、ワーカーロール側で処理を実行するために取得され、処理が終わった後削除されます(リスト5)。
//(1)定期実行 setInterval(function(){ //(2) キューメッセージの取得オプション var options = { numofmessages : 1, // 取得するメッセージ数 最大32 visibilitytimeout : 30 // 不可視時間(秒) }; //(3)メッセージの取得 queueClient.getMessages(SEND, options, function(err, msgs) { if(!err && msgs.length > 0) { console.log(msgs[0].messagetext); //(4) queueClient.deleteMessage(SEND, msgs[0].messageid, msgs[0].popreceipt, function(err) {}); } }) }, 2000);
(1)のsetInterval関数はNode.js組み込みのタイマー関数です。第2引数で指定されたミリ秒が経過するたびに、第1引数のコールバック関数が呼ばれます。ここでは2000ミリ秒(2秒)間隔でキューをポーリングしています。
(3)のgetMessagesメソッドでキューのメッセージを取得します。第1引数にキュー名、第2引数にオプション、第3引数にコールバック関数を指定します。オプションは省略可能ですが、ここでは明示的に(2)のオブジェクトで指定しています。
「numofmessages」は、一度に取得するメッセージ数を指定します。既定では1ですが、最大32まで指定可能です。「visibilitytimeout」はメッセージを取得したもののメッセージを削除しなかった場合に、指定した時間を経過した後に再びキューに現れる時間を指定します。これはキューからメッセージを取得したものの、例外等の理由でメッセージを削除できなかった場合に、再度そのメッセージを処理対象とするための機能です。
(4)のdeleteMessageでメッセージを削除します。第1引数にキュー名、第2~3引数にメッセージの情報を指定します。
キューの削除
キューをリセットするために、[キューの再作成]ボタンをクリックすると、キューを削除、作成します。リスト6は削除部分の抜粋です。
client.deleteQueue(SEND, function(err) { });
キューの削除は、deleteQueueメソッドを使います。キューに溜まっていたメッセージも一緒に削除されます。