2021/06/28

Salesforceのバッチスケジュールとは?バッチスケジュール概要や使い方をご紹介

 
  

バッチとは?

バッチとは、一定量のまとまったデータを一括で実行する処理のことです。 バッチは英語の「Batch」のことで、「一束(たば)」や「一団」と訳します。例えば、データが一定量蓄積された後に一括して計算処理を行うような処理をバッチ処理と言います。 また、パソコン起動時にもバッチ処理が動作しています。環境構築や自動設定などの命令が1つのファイルにまとめて記述されており、バッチ処理はパソコン起動時にこの命令を実行しています。

Salesforce のバッチスケジュールとは?

Salesforceでは、指定した時間にApexクラスを呼び出すバッチ処理を作成することができます。 指定した時間にApexクラスを呼び出すには、クラスにSchedulableインターフェースを実装してSalesforceユーザインターフェースの「Apexスケジューラ」を設定するか、「System.schedule」メソッドを使用するか、どちらかの方法があります。

Apexスケジューラ

指定した時間にApexクラスを実行する処理をApexスケジューラと呼びます。 Apexスケジューラでは、一度にスケジュールできるジョブ数は100です。現在設定しているジョブ数を確認するには、Salesforceの「スケジュール済みジョブ」ページを表示し、検索条件を「スケジュール済みApex」にすれば確認ができます。 Apexクラスをトリガからスケジュールする場合、注意する必要があります。制限を超えるスケジュールクラスをトリガで追加しないようにしてください。 特にAPI の一括更新、インポートウィザード、ユーザインターフェースからのレコード一括変更、複数レコードを一括更新するすべての処理は十分な考慮が必要です。

Schedulableインターフェースの実装

Apexクラスを一定間隔で実行するスケジュールを設定する場合は、Salesforceが提供するSchedulableインターフェースを実装する必要があります。 スケジューラの起動はシステムが行います。つまり、ユーザが起動するクラスの権限を持っているかどうかに関係なく、すべてのクラスが実行できます。 Salesforceユーザインターフェースを使用して、スケジュール済みApexジョブの実行を停止したり監視したりする場合は、「設定」から「クイック検索」で「スケジュール済みジョブ」を検索します。 Schedulableインターフェースには、1つのメソッドが含まれます。
global void execute(SchedulableContext sc){}
実装されたメソッドは global または public として宣言する必要があり、スケジュールを設定するクラスをインスタンス化するために使用します。

サンプル1

Schedulableインターフェースの実装例です。 mergeNumbersと呼ばれるクラスのSchedulableインターフェースを実装しています。
global class scheduledMerge implements Schedulable {
   global void execute(SchedulableContext SC) {
      mergeNumbers M = new mergeNumbers();
   }
}
このクラスを実装する場合、開発者コンソールで以下のコードを実装します。
scheduledMerge m = new scheduledMerge();
String sch = '20 30 8 10 2 ?';
String jobID = system.schedule('Merge Job', sch, m);

サンプル2

Apexの一括処理クラスでSchedulableインターフェースを実装する例です。 以下は、batchable一括処理クラスのSchedulableインターフェースを実装しています。
global class scheduledBatchable implements Schedulable {
   global void execute(SchedulableContext sc) {
      batchable b = new batchable();
      database.executebatch(b);
   }
}
一括処理をスケジュールする簡単な方法は、System.scheduleBatchメソッドを使用することです。この場合は、Schedulableインターフェースを実装する必要はありません。

スケジュール済みジョブの追跡と停止

スケジュール済みジョブを追跡したり停止したりすることが可能です。 スケジュール済みジョブを追跡する場合は、SchedulableContextオブジェクトを使用します。 SchedulableContextのgetTriggerIDメソッドは、スケジュール済みジョブに関連付けられている CronTriggerオブジェクトの ID を文字列として返すので、CronTriggerを照会すると、スケジュール済みジョブの進行状況を追跡できます。 スケジュール済みジョブを停止するには、getTriggerIDメソッドで取得したIDとSystem.abortJobメソッドを使用します。

クエリを使用した進捗状況の追跡

SalesforceのApexジョブがスケジュールされた後に、CronTriggerに対してSOQLクエリを実行すれば、進捗状況が取得できます。 以下の例のように、CronTrigger に対して SOQL クエリを実行することで、ジョブの実行回数、ジョブの再実行日時など、いくつかの詳細情報を取得することができます。
CronTrigger ct =
    [SELECT TimesTriggered, NextFireTime
    FROM CronTrigger WHERE Id = :jobID];
この例は、変数jobIDにジョブIDが保存されていることが前提です。

現在のジョブIDを取得するサンプル

現在のジョブIDを取得する場合は次のような例になります。 System.scheduleメソッドは、ジョブIDを返します。スケジュール可能なクラスのexecuteメソッド内で、SchedulableContext引数の変数scに対してのgetTriggerIdをコールすれば、現在のジョブIDを取得することができます。
CronTrigger ct =
    [SELECT TimesTriggered, NextFireTime
    FROM CronTrigger WHERE Id = :sc.getTriggerId()];

スケジュール済みジョブ件数を取得するサンプル

Apexスケジュール済みジョブの合計件数を取得する場合は次のような例になります。 ジョブ種別には、Apexスケジュール済みジョブ種別に対応した「7」を設定します。
SELECT COUNT() FROM CronTrigger WHERE CronJobDetail.JobType = '7'

Apexスケジューラのテスト

スケジュールされた Apexをテスト場合は、テストする前にスケジュール済みジョブが終了している必要があります。 これは、System.scheduleメソッドが、匿名プロセスを開始するためです。System.scheduleメソッドを実行する個所で、テストメソッドstartTestとstopTestを使用し、テストを続行する前にスケジュール済みジョブが終了するようにします。

System.Scheduleメソッドの使用

Schedulableインターフェースでクラスを実装した後は、System.Schedule メソッドを使用して実行します。 Apexスケジューラはシステム権限で実行されますのですべてのクラスが実行されます。 System.Scheduleメソッドは、ジョブ名称、ジョブ実行予定日時を表す式、クラス名称という 3 つの引数を使用します。次のような構文になります。
Seconds Minutes Hours Day_of_month Month Day_of_week Optional_year
System.Scheduleメソッドでは、スケジュールの基準としてユーザのタイムゾーンを使用します。ただし、実際の実行がサービスの使用可能状態によって遅れる場合もあります。

System.scheduleBatchメソッドの使用

System.scheduleBatchメソッドを使用すれば、一括処理ジョブをスケジュールすることができます。 System.scheduleBatchメソッドは、一括処理クラスでのみ使用可能です。また、Schedulableインターフェースを実装する必要はありません。これによって、一括処理ジョブが 1回実行されるスケジュールを簡単に設定することができます。

Salesforceのバッチスケジュールを活用しよう!

Salesforceのバッチスケジュールを使用すれば、指定した時間にApexクラスを呼び出すことが可能です。 スケジュールしておけば、手作業による非効率的な作業も自動化できるため、ぜひ活用できるようにしておきましょう。]]>

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞