SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Windows Azure新機能チュートリアル

Windows Azure for Node.jsでキュー、テーブルを操作しよう

Windows Azure 新機能チュートリアル(16)

  • X ポスト
  • このエントリーをはてなブックマークに追加

キューの作成

 アプリケーションが起動すると、キューが作成されます(リスト2)。サンプルでは送信用、返信用の2本のキューを利用しますが処理に違いはないので、片方を取り上げて説明します。

リスト2 キューの作成(WebRole1\routes\queue.js 4行目~)
// (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)。

リスト3 メッセージの追加(WebRole1\routes\queue.js 51行目~)
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のとおりです。

リスト4 ワーカーロールの構造
C:
└─WorkerRole1
        node.cmd             …(node.exeを起動するバッチファイル)
        node.exe             …(node.exe本体)
        server.js            …(起動スクリプト)
        setup_worker.cmd    …(セットアップ用バッチファイル)

 Webロールの場合、node.exeはIISによってホスティングされますが、ワーカーロールの場合はスタートアップタスクから直接起動されます。このためWebSocketのようにIISがサポートしていない通信を直接行いたい場合や、Webロールとは別ロールでタスクを処理したい場合などにワーカーロールが利用できます。

 さて送信キューに追加されたメッセージは、ワーカーロール側で処理を実行するために取得され、処理が終わった後削除されます(リスト5)。

リスト5 メッセージの取得(WorkerRole1\server.js 32行目~)
//(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は削除部分の抜粋です。

リスト6 キューの削除(WebRole1\routes\queue.js 86行目~)
client.deleteQueue(SEND, function(err) { });

 キューの削除は、deleteQueueメソッドを使います。キューに溜まっていたメッセージも一緒に削除されます。

次のページ
ビッグデータ管理に優れた「テーブル」

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Windows Azure新機能チュートリアル連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト statemachine(statemachine)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6671 2012/07/23 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング