
Velo 第95回 スケジュール・ジョブ
CMSを使って注文、顧客、アンケート管理等を行う場合、定期的なコレクションの整理や情報分析が必要になってきます。
また顧客へのバースデー・メッセージなども定期的なサービスになります。
こうしたサービスはアクセスの少ない深夜や顧客の誕生日に固定ルーチンとして自動で行いたいものです。
スケジュール・ジョブはこのことを実現してくれる機能です。
jobs.config
スケジュール・ジョブを登録するためにはバックエンドの jobs.config というコンフィギュ・ファイルに関数、日時等を登録する必要があります。下図をご覧下さい。

バックエンドの追加(⊕)をクリックし「スケジュール済ジョブ」を選択します。するとバックエンドに jobs.configファイルが自動的に追加されます。
ファイルを開くと以下の様な「記入例」が記載されていますので、この例に沿って登録を完成すればジョブは登録できます。

ここでは、2つの Job を登録した設定例が記載されています。要はキーが jobs、値が (jobの)配列となるオブジェクトを登録することです。
{ "jobs" : [ job_1, job_2, …, job_n ] }
そして各ジョブ(job_1, …)は以下の形式を持つオブジェクトです。
{
"functionLocation": "/someBackendFile.js",
"functionName": "someBackendFunction",
"description": "some job description",
"executionConfig": {some schedule}
}
上記2つの記入例の違いは some schedule の書き方の違いです。いずれにせよこの登録を行うことで、スケジューラーは、
some schedule に登録された時刻に
/someBackendFile.js に登録されたファイルの
someBackendFunction に登録された関数を
実行します。
実装
では実際にスケジュール・ジョブを実装してみましょう。jobs.config に以下の様に書き込みます。
ジョブは1つだけですが配列の形を取らなければいけません。
ここではバックエンドファイル saveTimeJob.web.js に、関数 saveTime を実行させる前提で設定ファイルを仕込んでいます。
description はコードには関係ないので何でも構いません。

最も重要な設定は executingConfig で、実行間隔を cron式と呼ばれる形式で記述しているところです。
cron式
スペース区切りの5つの値で "分 時 日 月 曜" を表現する式のことです。分は0~59、時は0~23、日は1~31、月は1~12、曜は0~6で表します。ただし、月は JAN~DEC、曜はSUN~SATの略号を使っても構いません。曜は 0 が日曜日を表しますので注意が必要です。
大切なのはワイルドカード*が使えることです。
例えば以下の様な設定と意味になります。
* * * * * 毎分
0 * * * * 毎時0分
*/10 * * * * 10分毎
0 0 * * * 毎日0時0分
0 0 1 * * 毎月1日0時0分
0 0 1 1 * 毎年1月1日0時0分
0 0 * * 0 毎日曜日0時0分
従って実装する日時設定は2番の「毎時0分になれば関数を実行する」設定になります。
UTC時間
何時何分と設定してもそれがどこの時刻なのかが決まってないと意味がありません。
cron式ではUTC時間つまりグリニッジ時間を使います。
従って0時0分は日本では9時0分になります。いわゆるGMT+0900になります。
コレクション
時刻をセーブするコレクション(jobCollection)を以下の様に用意しておきます。

日付フィールドの設定は「時間フィールドを含む」にチェックを入れておきます。こうしておくと日付オブジェクトをそのままセーブすることが出来ます。
ただしこのチェックを入れない場合は、書式としての文字列 "yyyy-mm-dd" で日付をセーブすることが出来ます。
ここでは使いませんが時間フィールドでは、書式としての文字列 "hh:mm" で時間をセーブすることが出来ます。
これらはいずれも Dateオブジェクトに .toISOString( )メソッドを施して得られる文字列 "yyyy-mm-ddThh:mm:ss.xxxZ" を slice( )メソッドで加工すれば簡単に得られる文字列です。
関数の定義
バックエンドの追加(⊕)をクリックし「webモジュールを追加」をクリックしファイル名を saveTimeJob.web.js とします。
ファイル名の末尾は .web.js にするように推奨されています。

このファイルに以下の様に webモジュールの形式で関数 saveTime を作ります。
ジョブのパーミッションはアドミンのみですのでパーミッションはそのように設定しています。

9行目でコレクションのアイテム数を調べ、11行目で記録回数と時刻をコレクションにセーブしています。
設定は以上で終了です。驚くほど簡単です。
実行結果
下図の様にコレクションに時間がセーブされています。微妙に秒がずれているのが面白いです。諸事情あったのでしょうか?

Velo開発のご依頼はこちら