Batch Apexとそのスケジュール方法

By | July 14, 2020

前書き:スケジュールフローについて

Apexでバッチ処理をスケジュールしたい場合は、それ以前にまずスケジュールトリガフローによる実装を検討するようにしてください。

実装方針決定の目安は概ね以下の通りです。

フローApex
一処理当たりの最大処理件数1000件1001件以上
実行間隔日次・週次その他

スケジュールトリガフローによる実装方法についてはこちらの記事を参考にしてください。

Batch Apexの概要

・Batch ApexではDatabase.Batchableインターフェースを実装する

・上記クラスには、①start()メソッド②execute()メソッド③finish()メソッドが必須

  1. start()メソッド:処理対象のレコードをクエリにより取得する
  2. execute()メソッド:処理を記述する
  3. 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」から確認可能です。