概要
特定のバッチ処理の終了後に、(当該の処理による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){
//任意の処理
}