Technology

Apex 一括処理 バッチの使用およびテストクラス

投稿日:

こんにちは、管理人の@Salesforce.Zです。
一括処理をバッチにすると、ガバナ制限を回避できるし、大量処理も可能。
うまく設計できたら、いいですね。

Apex Batchの構成

バッチのインターフェースを実装するには、3つの必要な次の 3 つのメソッドが含まれています。

  • Start Method
  • Execute Method
  • Finish Method

それぞれの構文があります。バッチの実行流れは下記の感じです。

  1. Startメソッドで、処理したいデータを取得 →バッチサイズで、分割→分割分ごとにExecuteメソッドにデータチャンクを渡す
  2. #1で分割したチャンクごとにExecuteメソッドで処理する
  3. すべてのチャンクをExecuteメソッドで処理完了後にFinishメソッドが動作(送信など)

Startメソッド構文

Executeメソッド 構文

Finishメソッド 構文

バッチクラス例

Database.Batchable インターフェースの実装

Database.QueryLocator と Iterable の比較

シンプルに対象レコードをクエリで、取得できる場合、Database.QueryLocatorでStartメソッドを用意して充分です。
複雑な場合、IterableでStartメソッドを用意する。
つまり、普段、 Database.QueryLocator でしてください。満足できない場合
Iterable を考えましょう。

ポイント QueryLocator Iterable
1返されるレコード数制限5,000万まで50,000まで
2バッチサイズ2,000まで無限
3処理複雑さシンプルの場合複雑な場合
条件付きのクエリとか集計関数を使うとか

Database.QueryLocator Start メソッドの場合

Iterable Startメソッドの場合

CustomIterable クラス

CustomIterable クラス を返す Iterable Startメソッド バッチクラス

集計関数をバッチ内で使用する Iterable Startメソッド バッチクラス 例1

バッチクラスで、そのまま集計関数をクリエしたら、下記のエラーになります。

Aggregate query does not support queryMore(), use LIMIT to restrict the results to a single batch

しかも、Iterable Startメソッドで、複雑なバッチを構築可能です。
ほとんどの場合、 Iterable Startメソッド を構築する前提となることが
イテレータ( Iterator )インターフェースとイテラブル( Iterable )インターフェースが必要になってくる

カスタムイテレータを用意した上で、カスタムイテラブルでカスタムイテレータをコールするように準備する、 

具体的なアルゴリズムは下記になります。

  1. カスタム イテレータ(Iterator)インターフェースを実装するクラス を用意する
  2. カスタムイテラブル( Iterable )インターフェースを実装するクラスを用意する
  3. カスタムバッチインターフェースを実装するクラスを用意する

イテレータ(Iterator)とイテラブル(Iterable)およびバッチを用意してから
コール順は下記になります

  1. バッチで、イテラブル(Iterable)をコール
  2. イテラブル(Iterable)で、イテレータ(Iterator)をコールする
  3. イテレータ(Iterator)で、クエリを行う
IteratorとIterableを用いて、集計関数をバッチ内で使用する応用コード例
ちょい解釈

Iterable Startメソッド は複雑な処理をするバッチを構築する場合に使うものなので、
イテレータとイテラブルの対象が集計関数じゃなくても良い、
クラスやなにかのコレクションのものでもよいです。
しっかり、イテレータとイテラブルを理解すれば、後は、バッチの開発の自由度がもっと高くなります。ぜひ活用できるようにしてください。

終わりに

整理

  • バッチクラスはインターフェースである「Database.Batchable」を実装する
  • バッチクラスはStart()、Execute()、Finish()3つメソッドを含めます。
  • Start()メソッドは処理したい対象(データ、何かのコレクション)を一括集めます。
  • Start()メソッドのreturnはDatabase.QueryLocator オブジェク または  ジョブに渡すレコードやオブジェクトが含まれる Iterable オブジェクト
  • Database.QueryLocator Startメソッドの場合、最大5,000件レコードを集めて、処理可能。 Database.executeBatch(b, BATCH_SIZE)のバッチサイズはデフォルトは200件、最大は2,000件まで指定可能、2,000より大きい値で指定しても、2,000になる
  • Iterable Startメソッドの場合、最大50,000件レコードを集めて、処理可能。 Database.executeBatch(b, BATCH_SIZE)のバッチサイズ は無限だがほかの制限が適用される
  • ExecuteメソッドはStartメソッドで集めたすべてのデータを分割したchunkごとに実行される、returnはAsyncApexObjectのID
  • Finishメソッドは分割したすべてのchunkが実行完了後に実行される
  • Database.BatchableContextはバッチジョブを追跡用
  • ジョブトランザクション全体でインスタンスメンバー変数またはデータを共有する場合は、クラス定義で Database.Stateful を使用 し、対応可能だが 使用しない場合、各トランザクションの開始時にすべてのメンバー変数が初期状態にリセット されてしまう

リファレンス

-Technology
-

執筆者:


comment

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

関連記事

SFDC Salesforce フィールドサービス Field Service コンサルタント資格 consultant certification

こんにちは、管理人の@Salesforce.Zです。 いよいよField Service認定試験を受験しようと思った。まず、概要を整理しようと、受験ガイドも記載しているが、なんだか書かないと頭に定着し …

git clone エラー128対策

gitで終了コード128エラーとなりリモートリポジトリがクローン出来ないでしょうか 私も今日、同じ問題に遭遇してしまい、2、3時間かかってしまった(泣)。絶対メモしようと思います。やりたいこともかんた …

【勉強法網羅】 sfdc フィールドサービス 試験準備

こんにちは、管理人の@Salesforce.Zです。 Salesforceには資格がたくさん設定をしている。開発系・デザイン系・コンサルタント系、さまざまな種類を設けている。今回、そのうちのField …

Salesforce2Slack Integration with Web API

前回、Webhook URLでSalesforceから、Slackのチャンネルに投稿する記事を公開した。非常にシンプルでした。今回、やや複雑なSlack Web APIを使って、投稿することをチャレン …

【保存版】SFDC SFS FSL field service フィールドサービス EXAM 資格問題110問

こんにちは、管理人の@Salesforce.Zです。 私も2014年から長年かけてSalesforceをやってきて(略称:SFDC)、Salesforce関連のノウハウや技術者などを中心としたブログも …