非同期 Apex の監視
一緒にトレイルを進みましょう
インストラクターと一緒にこの手順を進めますか? 次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。
(この動画は 1:25:18 の時点から始まります。戻して手順の最初から見直す場合はご注意ください。)
非同期ジョブの監視
非同期ジョブの優れた点は、バックグラウンドで黙々と処理することです。非同期ジョブの厄介な点も、バックグラウンドで黙々と処理することです。幸いにも、秘密裏に進められるジョブの様子を監視する方法がいくつかあります。
Salesforce ユーザーインターフェースですべてのジョブの状況を監視できます。[設定] から、[クイック検索] ボックスに「ジョブ」
と入力し、[Apex ジョブ] を選択します。
[Apex Jobs (Apex ジョブ)] ページには、すべての非同期 Apex ジョブが各ジョブの実行に関する情報と共に表示されます。次のスクリーンショットは、同じ Apex 一括処理クラスの 1 つの実行予定メソッドジョブと、2 つの完了した一括処理ジョブを示しています。
一括処理ジョブが多くある場合は、[Batch Jobs (一括処理ジョブ)] ページを使用して一括処理ジョブのみを表示します。[Apex Batch Jobs (Apex 一括処理ジョブ)] ページを開くには、[Apex Jobs (Apex ジョブ)] ページの上部にあるリンクをクリックします。[Apex Batch Jobs (Apex 一括処理ジョブ)] ページのスライダーを使用すると、特定の日付範囲を選択し、表示される一括処理ジョブのリストを絞り込むことができます。まだ削除されていない過去のジョブを参照できます。[Batch Jobs (一括処理ジョブ)] ページでは、ジョブが一括処理クラスごとにグループ化されます。
そのクラスで実行されたジョブについての詳細を参照するには、クラス ID の横にある [詳細情報] をクリックします。次の画像は、[More Info (詳細情報)] をクリックすると表示されるポップアップを示しています。この一括処理クラスには、正常に実行された 2 つのジョブがあります。
また、Apex ジョブは Apex Flex キューで状況を監視して、最初に処理されるジョブの順序を変更することができます。[設定] から、[クイック検索] ボックスに「ジョブ」
と入力し、[Apex Flex キュー] を選択します。
実行予定ジョブの監視
他のジョブと同様に、実行予定ジョブも [Apex Jobs (Apex ジョブ)] ページに表示されます。ただし現在、実行予定ジョブは Flex キューには含まれていません。
AsyncApexJob を照会すれば実行予定ジョブを見つけることができますが、注意が必要です。実行予定ジョブを送信しても ID が返されないため、ジョブを見つけるためには MethodName
や JobType
など他の何らかの項目で絞り込む必要があります。Stack Exchange のこの投稿には、役に立ちそうな SOQL クエリの例がいくつかあります。
SOQL を使用したキュー内のジョブの監視
送信したジョブに関する情報を照会するには、System.enqueueJob()
メソッドが返したジョブ ID で絞り込んで AsyncApexJob に対する SOQL クエリを実行します。
AsyncApexJob jobInfo = [SELECT Status, NumberOfErrors FROM AsyncApexJob WHERE Id = :jobID];
Flex キューを使用したキュー内のジョブの監視
Apex Flex キューを使用すると、最大 100 件の一括処理ジョブを実行のために送信できます。実行のために送信されたジョブは保留状況になり、Apex Flex キューに配置されます。一括処理ジョブは 100 件まで保留状況にできます。
ジョブは送信された順序 (先入れ先出し) で処理されます。キューの現在の順序を確認して、ジョブの順序を入れ替えることができるため、重要なジョブを先頭に動かしたり、さほど重要でないジョブを後方に移したりすることができます。
システムリソースが使用可能になった時点で、システムが Apex Flex キューの先頭にある次のジョブを取り出し、一括処理ジョブキューに移します。システムでは、組織ごとに最大 5 件のキュー内のジョブまたは有効なジョブを同時に処理できます。ジョブが移動されると、状況が [Holding (保留)] から [Queued (キュー)] に変更されます。キュー内にあるジョブは、システムが新しいジョブを処理できる状態になったときに実行されます。他のジョブと同様に、キュー内のジョブも [Apex Jobs (Apex ジョブ)] ページで監視できます。
スケジュール済みジョブの監視
Apex ジョブがスケジュールされた後、CronTrigger で SOQL クエリを実行すると、そのジョブに関する詳細を取得できます。次のサンプルでは、ジョブが実行された回数と再度実行される予定の日時が照会されます。ここでは、System.schedule()
メソッドから返される jobID
変数を使用します。
CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :jobID];
スケジュール可能なクラスの execute メソッド内でこのクエリを実行している場合は、SchedulableContext
引数の変数に getTriggerId()
をコールして、現在のジョブの ID を取得できます。
public class DoAwesomeStuff implements Schedulable { public void execute(SchedulableContext sc) { // some awesome code CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :sc.getTriggerId()]; } }
また、CronTrigger レコードに関連付けられている CronJobDetail レコードからジョブの名前と種別を取得することもできます。そのためには、CronTrigger に対してクエリを実行するときに CronJobDetail リレーションを使用します。次の例では、CronJobDetail にあるジョブの名前と種別を含む最新の CronTrigger レコードを取得します。
CronTrigger job = [SELECT Id, CronJobDetail.Id, CronJobDetail.Name, CronJobDetail.JobType FROM CronTrigger ORDER BY CreatedDate DESC LIMIT 1];
また、CronJobDetail を直接照会して、ジョブの名前と種別を取得することもできます。次の例では、前の例で照会した CronTrigger レコードのジョブの名前と種別を取得します。対応する CronJobDetail レコード ID は、CronTrigger レコードの CronJobDetail.Id 式によって取得されます。
CronJobDetail ctd = [SELECT Id, Name, JobType FROM CronJobDetail WHERE Id = :job.CronJobDetail.Id];
最後に、他の種別のすべてのスケジュール済みジョブを除く、すべての Apex スケジュール済みジョブの合計件数を取得するには、次のクエリを実行します。ジョブ種別には「7」という値が指定されています。これは、Apex スケジュール済みジョブの種別に対応します。全種別のリストは、「リソース」セクションの「CronJobDetail」を参照してください。
SELECT COUNT() FROM CronTrigger WHERE CronJobDetail.JobType = '7’