こんにちは、にいるです。
今回は、「非同期処理」について説明したいと思います。
1.非同期のメリット
非同期処理とは、リアルタイムで実行しないプログラムです。
リアルタイムで動かす必要がないため、非同期処理は同期処理と比べてメリットがいくつかあります。
- システムのリソースが空いたときに処理を実行する。
- 制限が緩和される
- ユーザが同時に別作業を実行できる
→実行時に実行プログラムすべての処理を実行する必要がない。
→ガバナ制限や実行制限が緩和され、より多くの処理を実行できる。
→非同期処理はバックグラウンドで実行されるため、ユーザは完了を待たずに違う作業を進行できる。
というように、通常のプログラムとは別のメリットがたくさんあります。
2.非同期処理の種類
次に非同期処理の種類についてみていきます。
非同期処理には4つの種類があります。
- futureメソッド
- Apexの一括処理
- Queueable Apex
- スケジュール済みのApex
よく使うものはApexの一括処理やスケジュール済みのApexになると思います。
それぞれ個別に見ていきましょう。
2-1.futureメソッド
futureメソッドは、メソッドにアノテーション「@future」を付与することで、そのメソッドを非同期処理として定義します。
■構文
1 2 3 4 5 6 |
global class ClassName { // メソッドには必ずstatic voidを使用する必要があります。 @future static void methodName(Id id){ } |
外部Webサービスへのコールアウトの場合は「@future (callout=true)」と定義します。
この場合、呼び出したと同時に非同期処理として実行されるのでクラス自体の後続処理も同じく実行されます。
※@future (callout=true)メソッドの戻り値の受け取りを待ちません。
また制約として引数パラメータのデータ型はプリミティブ型である必要があります。
sObjectを使用できない理由は、その非同期処理が実行されるまでにデータが変更される可能性があるためです。
コールが複数回あった場合、その実行順序は呼び出し順とはなりません。
便利なfutureメソッドを正しく使用できるように考慮事項もしっかり覚えておきましょう。
2-2.Apexの一括処理
一括処理は数千件~数百万件という大量のレコードに対して処理を実行する非同期処理です。
一括処理は、値更新などのデータ整備に適しています。
この場合startメソッドでソース = Aの取引先レコードを取得します。
executeメソッドにはAをBに書き換える処理を記載します。
finishには更新レコード数を取得してメールで通知する処理を記載します。
というよう流れで一括処理を自動化することが可能です。
また、Database.Statefulをクラスに定義すると、インスタンスメンバー変数を使用したトランザクション間での値保持が可能になります。
■構文
1 2 3 4 5 6 7 8 9 10 11 12 13 |
global class ClassName implements Database.Batchable<sObject> { global Database.QueryLocator start(Database.BatchableContext bc) { // SOQLやクエリロケータでレコードを取得する処理を記載します。 } global void execute(Database.BatchableContext bc, List<Object> scope){ // startのレコードリストを取得して、それらに実行したい処理を記載します。 } global void finish(Database.BatchableContext bc){ // ジョブの状況の検知やその結果をメール通知する処理を記載します。 } } |
Database.Batchable
2-3.Queueable Apex
Queueable Apexはfutureメソッドの上位互換です。
下記の特徴があります。
- 引数の制限なし
- ジョブの監視が可能
- ジョブのチェーニング
→引数パラメータの制約もないため、sObjectを使用することも可能です。
→System.enqueueJobメソッドを使用すると、AsyncApexJobのレコードIDが返されます。
このIDを使用してジョブの進行状況を把握できます。
→最大5階層で後続処理に別ジョブを指定できます。
■構文
1 2 3 4 |
public class ClassName implements Queueable { public void execute(QueueableContext context) { } } |
Queueableインターフェースを使用してクラスを定義する必要があります。
2-4.スケジュール済みのApex
最後はスケジューラ済みのApexです。
これは、指定した日時にApexクラスを動かすことができる非同期処理です。
よく、日次のデータ取込などの要件でApex一括処理と一緒に使用されます。
実行のスケジューリングはSystem.Scheduleメソッドを使用するか、ApexクラスのスケジューラUIから設定が可能です。
System.Scheduleメソッドを使用すれば分、秒単位で実行をスケジュールできるのでテストするのに最適です。
詳しくは【Salesforce】Apexバッチのスケジューリング方法をご覧ください。
■構文
1 2 3 4 |
global class ClassName implements Schedulable { global void execute(SchedulableContext ctx) { } } |
Schedulableインターフェースを使用してクラスを定義する必要があります。
3.非同期ジョブの監視について
最後に監視について説明します。
3-1.設定のApex ジョブ
非同期処理はバックグラウンドで処理されるため実行状況を確認できる場所が用意されています。
[設定]→[ジョブ]→[Apexジョブ]をクリックするとジョブの状況が確認できます。
ここには非同期、実行予定の両方が表示されます。
3-2.Flex キュー
実行待ちの非同期処理は保留のステータスでキューに配置され、これも設定から確認が可能です。
[設定]→[ジョブ]→[Apex Flex キュー]
ジョブは先入れ先出しで処理されますが、ここで実行順序を入れ替えることも可能です。
3-3.SOQL を使用したキュー内のジョブの監視
下記のSOQLを実行すればSystem.enqueueJob メソッドが返した「jobID」で絞り込みが可能です。
1 |
AsyncApexJob jobInfo = [SELECT Status, NumberOfErrors FROM AsyncApexJob WHERE Id = :jobID]; |
4.まとめ
いかがでしたでしょうか。
非同期処理はバッチやスケジューラの開発で使用するインターフェースです。
ユーザの完了を待たずに裏側で処理を実行できるので便利な機能です。
制限が緩和されますし、定期実行できる点が秀逸ですね。
上級デベロッパー試験にも関連してくるので、受験される方はしっかり押さえておきましょう。
皆さんもぜひ色々と試してみてください。
他にも色々と標準機能やSalesforce機能について紹介していますので、ご覧ください。
ではでは!
コメント