Parse - Cloud Code - Background Jobs
Background Jobs
Parseにはバックグラウンドで動作するジョブをセットすることができます。バックグラウンドジョブは、レスポンスタイムのかかる外部サイトとの連携や、プッシュノーティフィケーションのバッチ処理といった時間のかかるタスクに有効です。Cloudファンクションの実行でタイムアウトが発生した場合は、バックグラウンドジョブの実行を検討してください。
バックグラウンドジョブを実行するには、いくつかの制約に従う必要があります。
- ジョブの実行時間が15分を超えると終了する
- Basic planのユーザは並行処理できるジョブは1つだけとなる。他のスケジュールされたジョブはキューに登録される
- Pro planのユーザは並行処理できるジョブは2つとなる。 他のスケジュールされたジョブはキューに登録される
Writing a Background Job
バックグラウンドジョブの記述はCloudファンクションと似ています。Parse.Userオブジェクトにplanフィールドを追加するユーザマイグレーションを実行するなら次のようになります。
Parse.Cloud.job("userMigration", function(request, status) { // Set up to modify user data Parse.Cloud.useMasterKey(); var counter = 0; // Query for all users var query = new Parse.Query(Parse.User); query.each(function(user) { // Update to plan value passed in user.set("plan", request.params.plan); if (counter % 100 === 0) { // Set the job's progress status status.message(counter + " users processed."); } counter += 1; return user.save(); }).then(function() { // Set the job's success status status.success("Migration completed successfully."); }, function(error) { // Set the job's error status status.error("Uh oh, something went wrong."); }); });
Cloundファンクションではsuccess、errorをハンドリングしていました。バックグラウンドジョブでは、処理の完了時にstatus.success() かstatus.error()を呼び出すことで、ジョブの実行結果が設定されます。もし、これらのメソッドを呼び出さなかった場合、ジョブは持ち時間の15分を経過してタイムアウトする形になります*1。status.message()を呼び出せば処理の途中経過を出力できます。ただし、status.success()を呼び出した後にstatus.message()を呼び出しても無視されます。
上記のコードをデプロイしたら、次のコマンドを実行してテストしてみましょう。
curl -X POST \ -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ -H "X-Parse-Master-Key: ${MASTER_KEY}" \ -H "Content-Type: application/json" \ -d '{"plan":"paid"}' \ https://api.parse.com/1/jobs/userMigration
Setting up a Schedule
バックグラウンドジョブをデプロイできたら、DashboardのCloud Codeタブからジョブをスケジューリングできるようになります。Scheduled Jobsペインでは、スケジュール済みのジョブの確認と新たなジョブを追加することができます。新たなジョブを登録したら、ジョブの説明、必要なパラメータ、実行時間、実行頻度を指定します。スケジューリングされたジョブはその場で実行することもできます。また、ジョブスケジュールからの削除も可能です。Job Statusペインでは、ジョブの実行結果がリスト表示されます。ジョブの開始時間、最新のステータスメッセージ、実行結果を確認することができます。