Batch Apexの連続実行(Batch Chaining)について

By | February 1, 2022

概要

特定のバッチ処理の終了後に、(当該の処理によるDMLを前提とする)別のバッチ処理を動かす方法

結論

・Batch Apex内のfinish()メソッドから別のBatch Apexを呼び出すとよい(これは一般にBatch Chainingと呼ばれる)

・上記実装方法は、finish()メソッドがexecute()メソッド内の処理の終了後に実行されるという(Database.Batchableインターフェースを実装した)Batch Apexの仕様に基づく。

サンプル

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){
        UpdateParentAccountStatudScheduler upass = new UpdateParentAccountStatudScheduler ();
        Database.executeBatch(upass,BATCH_SIZE);        
    }
}


global with sharing class UpdateParentAccountStatudScheduler implements Database.Batchable<sObject>{  
    
    //データ取得
    global Database.QueryLocator start(Database.BatchableContext bc) {
        //任意の処理
    }
    
    //バッチ処理
    global void execute(Database.BatchableContext bc, List<Opportunity> oppList) {  
    //任意の処理
    }
        
    //終了後処理
    global void finish(Database.BatchableContext bc){
    //任意の処理
}