MENU
Abo
某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】分かる!分かるぞ!Apexバッチ処理【サンプルコードあり】

今回は「Apexバッチ処理」についてです。

目次

Apexバッチ処理とは

バッチ処理とは、

あらかじめ登録しておいた処理を、まとめて実行する処理

のことです。

例えば、「特定のデータを抽出して、それらを加工して、既存のデータを更新する処理を毎週日曜日の24:00に実行して!」とプログラムを組んでおくことで、その時間になれば自動で処理が実行されるようになります。

Apexを使用する処理なのでApexバッチ処理です。

必要なクラスとしては以下の2つです。

  • バッチ処理のロジックを記述したバッチクラス
  • バッチクラスを動かすためのスケジューラークラス

今回の記事では、バッチクラスの作成に焦点を当てているので、スケジューラークラスの作成に関して以下の記事をご覧ください。

Apexバッチ処理の特徴

Apexバッチ処理を実装するメリットとして以下のようなことが挙げられます。

  • 大量データを扱ってもガバナ制限に引っかかりにくい
  • 処理の実行タイミングを指定できる
  • 非同期処理として処理を実行できる

大量データを扱ってもガバナ制限に引っかかりにくい

Apexバッチ処理では、SOQLによって取得可能なレコード数の上限が5000万件にまで拡張されます。

ちなみに普通の処理での上限は50000件です。

そして取得したレコードを指定したレコード数ごとに分割して処理を行うため、1トランザクションごとに処理が小さくなり、ガバナ制限を超過することを防ぐことができます。

例)下記条件の場合、5000回に分割されて処理が実行されることになります。(100万 / 200)
1トランザクションあたりの処理レコード :200件
処理対象のレコード数:100万件

処理の実行タイミングを指定できる

Apexバッチ処理では処理を実行したいタイミングをスケジューリングしておく必要があります。

スケジュール方法としては以下の二つです。

  • 「設定」から実行タイミングを指定
  • Apexから実行タイミングを指定

非同期処理として処理を実行できる

Apexバッチ処理は非同期処理として実行されます。

非同期処理とは?
一つのタスクを実行中であっても他のタスクを実行できる実行方式のこと。
例)同期処理:作業Aをやって、Bをやって、Cをやって、最後にDをする。
  非同期処理:作業Aをやって、Bをやってる間にCもやって、最後にDをする。

非同期処理として実行されると何がいいかというと、Apexに設けられている様々な「Apex制限」を超過しないように実装を進めることが容易になります。

例えば、同期処理では、1トランザクションあたりのCPU時間の上限が10,000ミリ秒ですが、非同期処理では60,000ミリ秒に上限が拡大されています。

大量データの処理が想定される場合は非同期処理であるApexバッチを使用するのがよさそうですね。

参考 >> 「実行ガバナと制限

Apexバッチ処理の書き方

Apexバッチ処理は以下のように3つのメソッドから構成されています。

Apexバッチの構成
  • startメソッド:処理対象のレコードを取得するメソッド
  • executeメソッド:startメソッドで取得したレコードを使用し、処理を実行
  • finishメソッド:すべてのバッチ処理が実行された後に1回実行されるメソッド

以下、サンプルコードです。

public class AccountBatch implements Database.Batchable <sobject>, Database.Stateful{
    
    public Database.QueryLocator start(Database.BatchableContext dbc){
        system.debug('startメソッド');
        
        //処理対象の取引先取得クエリ作成
        String query = 'Select Id, Industry From Account Where Name Like \'取引先%\'';
        
        //取引先を取得し、executeメソッドに渡す
        return Database.getQueryLocator(query);          
    }
    
    public void execute(Database.BatchableContext dbc, List<Account> accList){
        system.debug('executeメソッド');
        
        List<Account> updList = new List<Account>();
        
        //startメソッドから受け取ったaccListを使用して処理実行
        for(Account acc : accList){
            Account newAcc = new Account();
            newAcc.Id = acc.Id;
            newAcc.Industry = 'Healthcare';
            updList.add(newAcc);
        }        
        if(updList.size() > 0){
            update updList;  
        }     
    }
    
    public void finish(Database.BatchableContext dbc){
         system.debug('finishメソッド');
        
    }
}

上のコードでは、startメソッドで、対象の取引先レコードを抽出しています。抽出したレコードをexecuteメソッドに渡し、executeメソッドの中で取引先の更新を行います。最後は、finishメソッドが実行されますが、特に実行したい処理がないので、何も書いていません。

上のサンプルコードを実行するためには、スケジュールクラスを作成し、実行タイミングを指定する必要がありますが、動確でいちいちそんなことをするのはめんどうなので、「Anonymous Window(匿名ウィンドウ)」を使用します。

「Anonymous Window」 は開発者コンソールの上部にある「Debug」タブから開けます。(Ctrl + Eでも開けます。)

ウィンドウを開いたら以下コードを入力します。 (実行するバッチと、バッチサイズを指定します)

AccountBatch ab = new AccountBatch();
Database.executeBatch(ab, 200);

「Open Log」にチェックを入れ「Execute」で実行すると、AccountBatchが実行されます。

かんたん。

まとめ

Apexバッチ処理はなんといっても大量データを扱う時に便利ですね。

ガバナ制限の超過を回避するという点でも非常に使い勝手がいいです。

今回はバッチのスケジュール方法には触れませんでしたが、以下の記事で紹介してますので、参考までにご覧ください。

おしまい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:Salesforce認定アドミニストレーター
     Salesforce認定Platformデベロッパー
     Salesforce認定上級Platformデベロッパー

コメント

コメントする

CAPTCHA


目次