ApexでBatch処理をスケジュールする方法

前書き

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

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

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

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

以下では、話を簡単にするために、毎月月初に既存の商談でクローズしていないものを全て自動クローズさせるというユースケースで解説していきたいと思います。

手順1(Batch Classの記述)

global with sharing class BatchAutoCloseOpportunities implements Database.Batchable<sObject>{
    List<Opportunity> opps = new List<Opportunity>();
    
    //データ取得
    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) {
    
    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');  
    }
}

手順2(Batch Classを呼び出すSchedule Classの記述)

global class ScheduleBatchAutoCloseOpportunities implements Schedulable {
global void execute(SchedulableContext sc) {
            BatchAutoCloseOpportunity b = new BatchAutoCloseOpportunity();
            database.executebatch(b,200);
      }
}

手順3(スケジュールの設定)

■宣言的に設定する場合

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);

↑こんな感じで実行します。

CRON Expressionは前から順にSeconds Minutes Hours Day Month Week Yearを意味します。

従って、上記のコードだと毎日11時0分0秒に実行されることになります。

スケジュールされたジョブはSchedule Apexから設定した場合と同様に「Setup>Environments>Jobs>Scheduled Jobs」から確認可能です。

Salesforce

Posted by regardie