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