💪

Apexでバッチ処理をバッチ処理から起動する

2021/02/14に公開

はじめに書いておきますが、やらなくてよいならやらないほうがいいです。
やらざるを得ない理由がある時だけ使いましょう。私の場合はデータが大きすぎて Apex CPU time limit exceeded が出てしまって処理ができなくなってしまった事が原因で対応しました。

親バッチ
public with sharing class 親バッチクラス implements Database.Batchable<sObject>, Database.Stateful {

  public Database.QueryLocator start(Database.BatchableContext bc) {
    return Database.getQueryLocator(
      'SELECT Id, Name FROM レコードがたくさんあるオブジェクト'
    );
  }

  public void execute(Database.BatchableContext bc, List<レコードがたくさんあるオブジェクト> p_timings) {
    // なんらかの複雑で大変な処理
  }
  public void finish(Database.BatchableContext bc) {
    // ここで次に処理したいバッチを呼ぶ
    子バッチクラス teamBatch = new 子バッチクラス();
    Database.executeBatch(teamBatch, 20);

    System.debug('----------- 子バッチを呼んだ');
  }
}

子バッチは基本的なバッチと実装方法は一緒です。constructorで引数を渡せば親バッチで処理した結果などを渡して処理する事が可能です。

ちなみに execute メソッドの中で実行すると実行時にExceptionが出ますので、 finish 時に実行するようにしましょう。

元になるレコードが多くて分割してバッチ処理したい&更に参照先のレコードの数が多いので分割したいときなどに役立つかもしれません。その後のメンテナンスは頑張って下さい。

Discussion