【Salesforce】バッチ処理の後に別のバッチ処理を起動する

【Salesforce】バッチ処理の後に別のバッチ処理を起動する

定時に行うバッチ処理がいくつかある場合、バッチ1の後にバッチ2を動かしたいということがあると思います。

バッチ1とバッチ2の時間をズラして実行していた環境を見たことがありますが、ちょっと不安な動きですよね。

そんなときはバッチ1のfinishメソッドでバッチ2を起動することで順番を確実なものにすることが出来ます。

 

バッチ1にあたる、先に処理を行うバッチです。

finish処理で次のバッチを呼び出しています。

/**
 * 取引先に関するバッチ
 */
global class AccountBatch implements Database.Batchable<sObject> {
 
    /**
     * 開始処理
     */
    global Database.QueryLocator start(Database.BatchableContext BC){
 
        String query = '';
         
        query = 'select Id, Name from Account';
 
        return Database.getQueryLocator(query);
    }
 
    /**
     * 実行処理
     */
    global void execute(Database.BatchableContext BC, List<Account> accountList){
 
        // 取得したレコードに対して処理を行う
        for(Account acc : accountList){
 
            // 各レコードに処理を行う
        }
 
        update accountList;
    }
 
    /**
     * 終了処理
     * 次のバッチを実行する
     */
    global void finish(Database.BatchableContext BC){
    
        ContactBatch batch;


        // テストの場合、処理を行わない
        if(Test.isRunningTest()){
        
            // バッチクラスを作成する
            batch = new ContactBatch();
            Database.executeBatch(batch, 200);
        }
    }
}

バッチ1から呼び出されるバッチ2です。

バッチ1の後に行いたい処理を記述します。

/**
 * 取引先責任者に関するバッチ
 */
global class ContactBatch implements Database.Batchable<sObject> {
 
    /**
     * 開始処理
     * バッチ処理対象のレコードを取得するための
     * クエリロケーターを返す
     */
    global Database.QueryLocator start(Database.BatchableContext BC){
 
        String query = '';
         
        query = 'select Id, Name from Contact';
 
        return Database.getQueryLocator(query);
    }
 
    /**
     * 実行処理
     */
    global void execute(Database.BatchableContext BC, List<Contact> contactList){
 
        // 取得したレコードに対して処理を行う
        for(Contact contact : contactList){
 
            // 各レコードに処理を行う
        }
 
        update contactList;
    }
 
    /**
     * 終了処理
     * バッチ処理完了のメールを飛ばしたりする
     */
    global void finish(Database.BatchableContext BC){
    
        // 
        
    }
}

とても簡単ですね。

例ではテストクラスの場合に動かないようにしています。

動いても問題ないのかもしれませんが、バッチ処理のテストクラスは分けているのでそうしています。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です