Parse.comでcronのような定期タスクを実行する


そもそもparse.comでcron / periodic taskは設定できるのか?

可能。

Cloud CodeのBackground Jobsを見るべし。

  • バックグラウンドジョブは15分で強制終了される
  • 秒間20タスクまで
  • 秒間20タスクの制限を超える状態でタスクが起動すると、直ちに終了される
  • cronのような定期タスクはダッシュボード設定可能

タスクの定義

Parse.Cloud.job()でジョブを定義できる。periodicHelloというタスクを定義して、hello関数を呼び出す。なお、 タスク終了時は必ずstatus.success()またはstatus.error()を呼び出す必要がある。

cloud/main.js
// hello()の定義
Parse.Cloud.define("hello", function(request, response) {
  response.success("Hello world!");
});

// ジョブの定義
Parse.Cloud.job("periodicHello", function(request, status) {
  Parse.Cloud.run('hello', {}, {
    success: function(result) {
      // タスクランナーにsuccess()を返す
      status.success('success!');
    },
    error: function(error) {
      // タスクランナーにerror()を返す
      status.error('error :-(');
    }
  });
});

定期タスクの設定

CoreタブのサイドメニューからJobsを選択してSchedule a jobを開く。

descriptionに適当な名前を入力し、Job Nameのプルダウンに定義済みのジョブが登録されているので選択する。Repeatで定期的に実行する時間を設定する。

設定するとジョブリストに追加される。Run Nowをクリックすると即座に実行される。

実行結果はJob StatusLogsで見ることが出来る。

トラブルシュート

タスク内からCloud Functionが呼び出せない

タスク内からCloud Functionを呼び出すことは出来ないみたい?

Cloud Function自体が非同期で動作するため、Cloud Functionの実行開始後にタスクが終了してしまいロジックが実行されないようだ。不便だけどタスクの中にすべての処理を追加する必要がありそう。

タスク内で実行したオブジェクト検索が実行されない

次のようにタスクの最後でreturnしてしまうとクエリは実行されない。

Parse.Cloud.job('job', function(request, status) {
  var Bike = Parse.Object.extend('Bike');
  var query = new Parse.Query(Bike);
  query.equalTo('broken', false);

  query.find({
    success: function(results) {
      // ここが実行されない
    }
  });

  return status.success('success');
});

クエリ実行後にreturnする。

Parse.Cloud.job('job', function(request, status) {
  var Bike = Parse.Object.extend('Bike');
  var query = new Parse.Query(Bike);
  query.equalTo('broken', false);

  query.find({
    success: function(results) {
      return status.success('success');
    }
  });
});

所感

JavaScriptで記述することになるが実行形態としては比較的容易な部類に入ると感じる。実行時の制限も少ない。1タスクで15分以上かかるような処理はそう多くないだろうし、並列処理できるのが20個までなのでこの点だけ注意。