進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

非同期 Apex の監視

学習の目的

この単元を完了すると、次のことを理解できるようになります。
  • さまざまな種別のジョブを監視する方法
  • Flex キューの使用方法

非同期ジョブの監視

非同期ジョブの優れた点は、バックグラウンドで黙々と処理することです。非同期ジョブの厄介な点も、バックグラウンドで黙々と処理することです。幸いにも、秘密裏に進められるジョブの様子を監視する方法がいくつかあります。

Salesforce ユーザインターフェースですべてのジョブの状況を監視できます。[設定] から、[クイック検索] ボックスに「ジョブ」と入力し、[Apex ジョブ] を選択します。

[Apex ジョブ] ページには、すべての非同期 Apex ジョブが各ジョブの実行に関する情報と共に表示されます。次のスクリーンショットは、同じ Apex 一括処理クラスの 1 つの実行予定メソッドジョブと、2 つの完了した一括処理ジョブを示しています。

Apex ジョブ

一括処理ジョブが多くある場合は、[一括処理ジョブ] ページを使用して一括処理ジョブのみを表示します。[Apex 一括処理ジョブ] ページを開くには、[Apex ジョブ] ページの上部にあるリンクをクリックします。[Apex 一括処理ジョブ] ページのスライダを使用すると、特定の日付範囲を選択し、表示される一括処理ジョブのリストを絞り込むことができます。まだ削除されていない過去のジョブを参照できます。[一括処理ジョブ] ページでは、ジョブが一括処理クラスごとにグループ化されます。

Apex 一括処理ジョブ

そのクラスで実行されたジョブについての詳細を参照するには、クラス ID の横にある [詳細情報] をクリックします。次の画像は、[詳細情報] をクリックすると表示されるポップアップを示しています。この一括処理クラスには、正常に実行された 2 つのジョブがあります。

親ジョブについての情報

また、Apex ジョブは Apex Flex キューで状況を監視して、最初に処理されるジョブの順序を変更することができます。[設定] から、[クイック検索] ボックスに「ジョブ」と入力し、[Apex Flex キュー] を選択します。

実行予定ジョブの監視

他のジョブと同様に、実行予定ジョブも [Apex ジョブ] ページに表示されます。ただし現在、実行予定ジョブは Flex キューには含まれていません。

AsyncApexJob を照会すれば実行予定ジョブを見つけることができますが、注意が必要です。実行予定ジョブを送信しても ID が返されないため、ジョブを見つけるためには MethodNameJobType など他の何らかの項目で絞り込む必要があります。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 件のキュー内のジョブまたは有効なジョブを同時に処理できます。ジョブが移動されると、状況が [保留] から [キュー] に変更されます。キュー内にあるジョブは、システムが新しいジョブを処理できる状態になったときに実行されます。他のジョブと同様に、キュー内のジョブも [Apex ジョブ] ページで監視できます。

スケジュール済みジョブの監視

Apex ジョブがスケジュールされた後、CronTrigger で SOQL クエリを実行すると、そのジョブに関する詳細を取得できます。次のサンプルでは、ジョブが実行された回数と再度実行される予定の日時が照会されます。ここでは、System.schedule メソッドから返される jobID 変数を使用します。

CronTrigger ct = [SELECT TimesTriggered, NextFireTime FROM CronTrigger WHERE Id = :jobID];

スケジュール可能なクラスの execute メソッド内でこのクエリを実行している場合は、SchedulableContext 引数の変数に getTriggerId をコールして、現在のジョブの ID を取得できます。

global class DoAwesomeStuff implements Schedulable {

    global 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’

リソース