Apexバッチ スケジュール実行について

  • URLをコピーしました!

Salesforceには、業務に必要な手作業を減らし処理の自動化を図るための様々な機能が用意されていますが、より複雑な業務要件を満たすにはコーディングが必要になる場面もあります。
そのひとつに、大量データの処理を定期的に実行できるApexバッチのスケジュール設定があります。本記事では、スケジュール設定の実装の際に気を付けるべきポイントと、スケジュールのアイデアをご紹介します。

目次

スケジュール数の制限

組織で設定できるスケジュールの数は100個までという制限があります。
この制限の対象には以下のものが含まれます。
 ・レポートのスケジュール実行
 ・スケジュールトリガーフロー
 ・時間ベースのワークフロー
 ・スケジュールApex

「〇分おきに実行」のスケジュールはデフォルトでは不可

スケジュールの設定の方法は公式ドキュメントに記載がありますのでここでは詳細な説明は割愛しますが、設定画面から、Apexコードからの2パターンがあります。
いずれも「定めた時刻に1回実行」のスケジュールを設定することができます。

設定画面のスケジュールビルダー

Cron式でより細かな開始時刻を指定できます。
下図であれば毎時30分にApexバッチが実行されます。

SalesforceのCron式では下記のような記述はサポートされていません。

【*/5 * * * *】(0分、5分、10分、……、55分)
【3-58/5 * * * *】(3分、8分、13分、……、58分)

したがって、例えば5分おきに実行したい場合は【0 0 * * * ?】【0 5 * * * ?】【0 10 * * * ?】のようにそれぞれスケジュールを設定する必要があります。
これを複数のバッチで設定してしまうと、あっという間にスケジュール数の制限に達してしまいます。

まずできることは、ほんとうにその頻度での実行が必要なのか業務要件の見直しです。
そのうえで、定期的に外部サービスにアクセスして最新のデータを取得したい場合など、どうしても数分おきに実行したい処理もあるかと思います。
なんとかスケジュール数を節約する方法がないか考えてみました。

System.scheduleBatchメソッド

バッチ処理の最後に次回スケジュールを設定するようにしました。

System.scheduleBatch(【バッチクラス】,【スケジュールジョブの名前】, 【何分後に実行するか】);

第一引数:【バッチクラス】
スケジュール実行したいバッチクラスのインスタンスを指定します。
スケジューラクラスではありません。

第二引数:【スケジュールジョブの名前】
一意となるようなジョブの名前をString型の値で指定します。

第三引数:【何分後に実行するか】
こちらは0より大きいInteger型の値を指定します。
このメソッドをコールした日時を起点としてスケジュールされます。

前回のバッチ実行が終了するまでに時間がかかってしまった場合は、きっちり正確に〇分後とはいかず正しくスケジュールされない場合がありますが、executeの処理が概ね1分以内に終わるものであればほとんど定期実行となりました。
また、なんらかの理由でバッチの処理自体がエラーとなってしまった場合、次回スケジュールが行われないので、リカバリ用として1時間に1回のスケジュールは設定しました。
業務要件にあわせて検討してみてください。

まとめ

Apexバッチのスケジュール設定についてご紹介しました。
近年はSalesforceフローの機能もとても充実してきたのでノーコードでの実装も増えてきたと思いますが、今回ご紹介したような分刻みでの実行はまだコーディングが必要です。
この記事が開発の一助となれますように!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次