【Salesforce】非同期処理の特徴と使い方について

スポンサーリンク
【Salesforce】非同期処理の特徴と使い方について Apex

こんにちは、にいるです。

今回は、「非同期処理」について説明したいと思います。

【ヘルプ】実行ガバナと制限

1.非同期のメリット

非同期処理とは、リアルタイムで実行しないプログラムです。
リアルタイムで動かす必要がないため、非同期処理は同期処理と比べてメリットがいくつかあります。

  • システムのリソースが空いたときに処理を実行する。
  • →実行時に実行プログラムすべての処理を実行する必要がない。

  • 制限が緩和される
  • →ガバナ制限や実行制限が緩和され、より多くの処理を実行できる。

  • ユーザが同時に別作業を実行できる
  • →非同期処理はバックグラウンドで実行されるため、ユーザは完了を待たずに違う作業を進行できる。

というように、通常のプログラムとは別のメリットがたくさんあります。

2.非同期処理の種類

次に非同期処理の種類についてみていきます。
非同期処理には4つの種類があります。

  • futureメソッド
  • Apexの一括処理
  • Queueable Apex
  • スケジュール済みのApex

よく使うものはApexの一括処理やスケジュール済みのApexになると思います。

それぞれ個別に見ていきましょう。

2-1.futureメソッド

futureメソッドは、メソッドにアノテーション「@future」を付与することで、そのメソッドを非同期処理として定義します。

■構文

外部Webサービスへのコールアウトの場合は「@future (callout=true)」と定義します。
この場合、呼び出したと同時に非同期処理として実行されるのでクラス自体の後続処理も同じく実行されます。
※@future (callout=true)メソッドの戻り値の受け取りを待ちません。

また制約として引数パラメータのデータ型はプリミティブ型である必要があります。

sObjectを使用できない理由は、その非同期処理が実行されるまでにデータが変更される可能性があるためです。

コールが複数回あった場合、その実行順序は呼び出し順とはなりません。

便利なfutureメソッドを正しく使用できるように考慮事項もしっかり覚えておきましょう。

2-2.Apexの一括処理

一括処理は数千件~数百万件という大量のレコードに対して処理を実行する非同期処理です。
一括処理は、値更新などのデータ整備に適しています。

例えば、取引先のソースをAからBに設定したいとします。

この場合startメソッドでソース = Aの取引先レコードを取得します。

executeメソッドにはAをBに書き換える処理を記載します。

finishには更新レコード数を取得してメールで通知する処理を記載します。

というよう流れで一括処理を自動化することが可能です。
また、Database.Statefulをクラスに定義すると、インスタンスメンバー変数を使用したトランザクション間での値保持が可能になります。

■構文

Database.Batchableインターフェースを使用してクラスを定義する必要があります。

2-3.Queueable Apex

Queueable Apexはfutureメソッドの上位互換です。
下記の特徴があります。

  • 引数の制限なし
  •  →引数パラメータの制約もないため、sObjectを使用することも可能です。

  • ジョブの監視が可能
  •  →System.enqueueJobメソッドを使用すると、AsyncApexJobのレコードIDが返されます。
    このIDを使用してジョブの進行状況を把握できます。

  • ジョブのチェーニング
  •  →最大5階層で後続処理に別ジョブを指定できます。

■構文

Queueableインターフェースを使用してクラスを定義する必要があります。

2-4.スケジュール済みのApex

最後はスケジューラ済みのApexです。

これは、指定した日時にApexクラスを動かすことができる非同期処理です。
よく、日次のデータ取込などの要件でApex一括処理と一緒に使用されます。

実行のスケジューリングはSystem.Scheduleメソッドを使用するか、ApexクラスのスケジューラUIから設定が可能です。
System.Scheduleメソッドを使用すれば分、秒単位で実行をスケジュールできるのでテストするのに最適です。
詳しくは【Salesforce】Apexバッチのスケジューリング方法をご覧ください。

■構文

Schedulableインターフェースを使用してクラスを定義する必要があります。

3.非同期ジョブの監視について

最後に監視について説明します。

3-1.設定のApex ジョブ

非同期処理はバックグラウンドで処理されるため実行状況を確認できる場所が用意されています。
[設定]→[ジョブ]→[Apexジョブ]をクリックするとジョブの状況が確認できます。

ここには非同期、実行予定の両方が表示されます。

非同期処理

3-2.Flex キュー

実行待ちの非同期処理は保留のステータスでキューに配置され、これも設定から確認が可能です。
[設定]→[ジョブ]→[Apex Flex キュー]

ジョブは先入れ先出しで処理されますが、ここで実行順序を入れ替えることも可能です。

非同期処理

3-3.SOQL を使用したキュー内のジョブの監視

下記のSOQLを実行すればSystem.enqueueJob メソッドが返した「jobID」で絞り込みが可能です。

4.まとめ

いかがでしたでしょうか。

非同期処理はバッチやスケジューラの開発で使用するインターフェースです。
ユーザの完了を待たずに裏側で処理を実行できるので便利な機能です。

制限が緩和されますし、定期実行できる点が秀逸ですね。
上級デベロッパー試験にも関連してくるので、受験される方はしっかり押さえておきましょう。

皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。

ではでは!

Salesforce 機能別 まとめページ

コメント

タイトルとURLをコピーしました