スケジューラ
定義された時間間隔で関数を実行します。
スケジューラはデコレータの一種で、関数に適用すると、その関数が UTC 時間に基づいて一定間隔で実行されるようになります。スケジューリングは通常、UTC の cron expression を使って指定します。
関数自体は、データベースのクエリ、メール送信、API 呼び出しなど、任意の処理を実行できます。
@scheduler デコレータは、cron expression をパラメータとして受け取ります。
cron expression は、協定世界時 (UTC) に基づいて関数をいつ実行するかを定義する文字列です。expression を定義する際は、希望する時刻を UTC に変換することが重要です。
cron expression は次のように定義されます。
* * * * * *
| | | | | |
| | | | | day of week
| | | | months
| | | day of month
| | hours
| minutes
seconds (optional)
Backend SDK の CronExpression enum を使うと、あらかじめ定義された cron interval にもアクセスできます。
スケジューラの作成
スケジューラを作成するには、ベースの SquidService クラスを拡張したクラス内の関数に @scheduler デコレータを使用します。
import { CronExpression, SquidService, scheduler } from '@squidcloud/backend';
export class ExampleService extends SquidService {
@scheduler('sendEmailReminders', CronExpression.EVERY_MINUTE)
async sendEmailReminders(): Promise<void> {
// TODO - implement email functionality
}
}
exclusive パラメータ
@scheduler デコレータは 3 つのパラメータを受け取ります: 実行する関数名、interval、そしてその関数を exclusive にするかどうかです。exclusive パラメータは boolean です。true に設定すると、スケジューラは同時に 1 つのインスタンスだけが実行されます。別のインスタンスが実行中のときに新しいインスタンスの実行時刻が来た場合、新しいインスタンスはスキップされます。
たとえば、毎分実行されるスケジューラがあり、前回のインスタンスが 1 分経ってもまだ実行中の場合、新しいインスタンスは実行されません。exclusive のデフォルト値は true です。
@scheduler('sendEmailReminders', CronExpression.EVERY_MINUTE, true)
false に設定すると、前回のインスタンスが完了しているかどうかに関係なく、スケジューラのインスタンスが実行されます。つまり、同時に複数のインスタンスが動作する可能性があります。
スケジューラの無効化
スケジューラは無効化 (disable) と有効化 (enable) が可能です。無効化されたスケジューラは、再度有効化されるまで実行されません。無効化されたスケジューラは redeploy を跨いでも無効化状態を維持しますが、undeploy 後に行われる deploy では、すべてのスケジューラが有効になります。
await this.squid.schedulers.disable('schedulerId');
// Re-enable the scheduler at a later time
await this.squid.schedulers.enable('schedulerId');
list メソッドで全スケジューラを確認することもできます。これは、現在の状態 (enabled/disabled) を含むすべてのスケジューラを返します。
await this.squid.schedulers.list();
サービスのエクスポート
Squid がスケジューラおよび同じ service 内の他の関数を検出できるように、service/index.ts ファイルでサービスがエクスポートされていることを確認してください。
export * from './example-service';