【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.