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

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

関連記事

Salesforce カスタム設定 カスタムメタデータ 比較 使うべきなのは?

カスタム設定/カスタムメタデータの使用について、どっちを使うべきかをここではっきりできる

再出品大変 新ラクマ フリル 自動出品ツール black cat 自動で稼げる

フリマ運営するなら、出品が大変です。僕もそんな感じです。撮影はもちろん、出品も大変、さらに売れない時に再出品もしないといけない。結構労力が必要な仕事です。その中で、出品と再出品の労力と時間を節約してく …

Salesforce2Slack Integration インテグレーション シンプル

IT業界では、インテグレーションをすれば、いろいろな製品をつながって、弱点やできないことを補うことができる、良いところですね。今回、Slackの投稿をSalesforceから操作したいので、関連設定や …

no image

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

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

Salesforce 主従関係 所有者について以外に知らない子が多い

こんにちは、管理人の@Salesforce.Zです。 主従関係ってもう十分、 ほとんどのcoder の頭に定着したと思います。しかし、これが知っていますか。所有者の話。子sObjectに所有者項目がな …