normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Windows Azure モバイルサービス - スケジューラのTIPS について 〜その1 モジュール読み込み編〜

3/4 にWindows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More…にてAndroid のサポートも発表され、ますます機能改善がはかられているモバイルサービスだが、スケジューラ機能が存在することはご存じだろうか。スケジューラの簡単な実行方法については蒼の王座 - Windows Azureで定期ジョブを実行する方法を確認してほしい。
以下は、私がスケジューラでスクリプトを作成して得たノウハウだ。参考になれば幸いだ。

簡単な利用方法

「モバイルサービス - スケジューラ」から新規にスケジューラを作成し、以下のコードを作成する。

var azure = require('azure');
var ServiceClient = azure.ServiceClient;
var TableQuery = azure.TableQuery;

var tableName = 'posts';
var partition = 'part1';
var rowkey = 'bbbbbb';

function mycronjob() {
    console.log("starting job....");
var tableClient = azure.createTableService("<ストレージサービス名>",
 "<ストレージサービス・キー>",
 "http://<ストレージサービス名>.table.core.windows.net/");

tableClient.createTableIfNotExists(tableName, function (err, created) {
    console.log('Setting up demo data ...');
    var now = new Date().toGMTString();
    var entity = { PartitionKey: partition, RowKey: rowkey + now, title: 'Post one', body: 'Body one', created_at: now };
    tableClient.insertEntity(tableName, entity, null, function(err){
       console.log(err);
    });
  });
}

管理ポータルから「一度だけ実行」を選択すると以下の様にストレージサービスにデータが格納されていることが確認できる。

ローカルでのデバッグ方法

上記のコードを見てお気づきの方はいると思うが、どうやらスケジューラのランタイムは Node.js の様だ。実際、上記のコードに最後の一行(メソッドキック用の「mycronjob();」)を足し、以下のコードを node.exe script.js 等でローカル実行しても同じ結果が得られる。

var azure = require('azure');
var ServiceClient = azure.ServiceClient;
var TableQuery = azure.TableQuery;

var tableName = 'posts';
var partition = 'part1';
var rowkey = 'bbbbbb';

function mycronjob() {
    console.log("starting job....");
var tableClient = azure.createTableService("<ストレージサービス名>",
 "<ストレージサービス・キー>",
 "http://<ストレージサービス名>.table.core.windows.net/");

tableClient.createTableIfNotExists(tableName, function (err, created) {
    console.log('Setting up demo data ...');
    var now = new Date().toGMTString();
    var entity = { PartitionKey: partition, RowKey: rowkey + now, title: 'Post one', body: 'Body one', created_at: now };
    tableClient.insertEntity(tableName, entity, null, function(err){
       console.log(err);
    });
  });
}

mycronjob();

お勧めの開発の流れは以下だと思われる。

  1. ローカルの Node.js ランタイムで操作
  2. 管理ポータルの「一度だけ実行」でテスト
  3. 管理ポータルで運用に乗せる

モジュール読み込みについて

管理ポータルで利用可能な Node.js モジュールはかなり制限があり、調査なしに require すると以下のように失敗する場合がある。

ログ エントリの詳細

エラー
Error in script '/scheduler/mycronjob.js'. Error: The module 'http' cannot be used from within a script.
    [external code]
    at </scheduler/mycronjob.js>:1:25
    [external code]

内容は以下のように管理ポータルで確認できる。

また、現時点で私が失敗した require を以下に記載しておく。

  • uuid
  • http
  • io

参考リンク

その他、利用可能?なスクリプトに関しては以下を参考にしていただきたい。