Warning: Use of undefined constant SECURE_AUTH_COOKIE - assumed 'SECURE_AUTH_COOKIE' (this will throw an Error in a future version of PHP) in /home/oikeru/oikeru.com/public_html/wp-includes/pluggable.php on line 805

Warning: Use of undefined constant LOGGED_IN_COOKIE - assumed 'LOGGED_IN_COOKIE' (this will throw an Error in a future version of PHP) in /home/oikeru/oikeru.com/public_html/wp-includes/user.php on line 527
SFDC apex バッチ基礎および様々な応用 | カネ | ライフ | 技術

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

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

関連記事

【攻撃実例】 wordpress管理者へ セキュリティをしっかりしよう

サイトに症状がなくても、あなたのサイトにもう既にウィルス感染しているかもしれません。サーバーのファイルをひたすらみてみてください。おかしいファイルありませんか。稼いでるサイトの裏に実はウィルスファイルが置かれていることが別のケース対応で、ついでに発見したことがあります。

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

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

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

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

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

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

【FSL】 作業指示 作業指示明細 サービス予定の関係

こんにちは、管理人の@Salesforce.Zです。 Contents1 作業指示とサービス予定2 作業指示に対する、作業指示明細とサービス予定 作業指示とサービス予定 通常では、作業指示(WorkO …