Contents
前書き:スケジュールフローについて
Apexでバッチ処理をスケジュールしたい場合は、それ以前にまずスケジュールトリガフローによる実装を検討するようにしてください。
実装方針決定の目安は概ね以下の通りです。
フロー | Apex | |
一処理当たりの最大処理件数 | 1000件 | 1001件以上 |
実行間隔 | 日次・週次 | その他 |
スケジュールトリガフローによる実装方法についてはこちらの記事を参考にしてください。
Batch Apexの概要
・Batch ApexではDatabase.Batchableインターフェースを実装する
・上記クラスには、①start()メソッド②execute()メソッド③finish()メソッドが必須
- start()メソッド:処理対象のレコードをクエリにより取得する
- execute()メソッド:処理を記述する
- finish()メソッド:execute()メソッドの実行が全て終了した後に実行したい処理を記述する
本記事でのユースケース
毎月月初に既存の商談でクローズしていないものを全て自動クローズさせる
Batch Classのサンプル
global with sharing class BatchAutoCloseOpportunities implements Database.Batchable<sObject>{
//データ取得
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator(
'SELECT id,StageName FROM Opportunity WHERE IsClosed = FALSE'
);
}
//バッチ処理
global void execute(Database.BatchableContext bc, List<Opportunity> oppList) {
List<Opportunity> opps = new List<Opportunity>();
for(Opportunity opp: oppList){
if(opp.IsClosed == FALSE){
opp.StageName = '失注';
opps.add(opp);
}
}
if(opps.size()>0){
update opps;
}
}
//終了後処理
global void finish(Database.BatchableContext bc){
System.debug('AutoCloseOpportunityBatchProcessCompleted');
}
}
Batch Classのスケジュール
Batch Classを直接定期実行したい場合は、System.scheduleBatchメソッドを利用する。
実装方針としては大きく下記のいずれか。
方針1:Schedulableインターフェースを実装した別クラスを作成する(※2クラスに分かれる)
方針2:Batch ClassにSchedulableインターフェースを実装する。 (※1クラスで済む)
方針1:別Schedule Classのサンプル
global class ScheduleBatchAutoCloseOpportunities implements Schedulable {
global void execute(SchedulableContext sc) {
BatchAutoCloseOpportunity b = new BatchAutoCloseOpportunity();
database.executebatch(b,200);
}
}
方針2:Batch ClassへのSchedulableインターフェース実装サンプル
global with sharing class BatchAutoCloseOpportunities implements Database.Batchable<sObject>,Schedulable{
//バッチスケジュール
global void execute(SchedulableContext sc) {
BatchAutoCloseOpportunity b = new BatchAutoCloseOpportunity();
database.executebatch(b,200);
}
//データ取得
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator(
'SELECT id,StageName FROM Opportunity WHERE IsClosed = FALSE'
);
}
//バッチ処理
global void execute(Database.BatchableContext bc, List<Opportunity> oppList) {
List<Opportunity> opps = new List<Opportunity>();
for(Opportunity opp: oppList){
if(opp.IsClosed == FALSE){
opp.StageName = '失注';
opps.add(opp);
}
}
if(opps.size()>0){
update opps;
}
}
//終了後処理
global void finish(Database.BatchableContext bc){
System.debug('AutoCloseOpportunityBatchProcessCompleted');
}
}
スケジュールの設定方法
■宣言的に設定する場合
Apex Classページの「Schedule Apex」からBatch処理のスケジュールを実行できます。
スケジュールされたジョブは「Setup>Environments>Jobs>Scheduled Jobs」から確認可能です。
■Execute Anonymous Windowから実行する場合
ScheduleBatchAutoCloseOpportunites p = new ScheduleBatchAutoCloseOpportunities();
String sch = '0 0 11 * * ?';
system.schedule('AutoCloseOpportunities', sch, p);
既存のスケジュール済みジョブを削除の上、 System.scheduleBatchメソッドを実行します(※上記は一例)。
CRON Expressionは前から順にSeconds Minutes Hours Day Month Week Yearを意味します。
従って、上記のサンプルコードの場合、毎日11時0分0秒に実行されます。
スケジュールされたジョブはSchedule Apexから設定した場合と同様に「Setup>Environments>Jobs>Scheduled Jobs」から確認可能です。