この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Apex 一括処理からのプラットフォームイベントの起動 (ベータ)

Apex 一括処理クラスは、エラーまたは例外が発生したときにプラットフォームイベントの起動を選択できます。イベントをリスンしているクライアントは、実用的な情報 (イベントの失敗頻度や失敗時に範囲内にあったレコードなど) を取得できます。イベントは、Salesforce Platform 内部エラーや、ガバナ制限に達したために発生する LimitExceptions などのキャッチできない Apex 例外でも起動されます。

Apex 一括処理エラーイベントはベータ機能としてのプレビュー版であり、Salesforce とのマスターサブスクリプション契約における「サービス」には含まれません。この機能はお客様各自の裁量で使用し、購入するときは、現在正式にリリースされている製品および機能に基づいて判断してください。Salesforce はこの機能の特定期間内の正式リリースまたはリリースの有無を保証しません。また、いかなる時点でもこの機能を終了できるものとします。この機能は、評価のみを目的とし、本番での使用を目的としたものではありません。この機能は、そのままの状態で提供され、サポートされておらず、ここから生じる、またはこれに関連する被害または損害に対して、Salesforce はいかなる責任も負いません。すべての制約、Salesforce の権利の保留、本サービスに関する義務、および関連する Salesforce 以外のアプリケーションならびにコンテンツの条件は、この機能の使用に等しく適用されます。

メモ

イベントレコードでは、Apex ジョブ UI よりも詳細なエラーの追跡情報が提供されます。イベントレコードには処理中のレコード ID、例外種別、例外メッセージ、スタック追跡が含まれます。失敗のカスタム処理と再試行ロジックを組み込むこともできます。カスタム Apex ロジックは、この種のイベントの任意のトリガから呼び出すことができるため、Apex 開発者はカスタムロギングや自動再試行処理などの機能を構築できます。

プラットフォームイベントの登録については、「プラットフォームイベントの登録」を参照してください。

BatchApexErrorEvent オブジェクトは、Apex 一括処理クラスに関連付けられているプラットフォームイベントを表します。このオブジェクトは API バージョン 44.0 以降で使用できます。詳細は、「BatchApexErrorEvent (ベータ)」を参照してください。

プラットフォームイベントを起動するには、Apex 一括処理クラス宣言で Database.RaisesPlatformEvents インターフェースを実装する必要があります。
1public with sharing class YourSampleBatchJob implements Database.Batchable<SObject>, 
2   Database.RaisesPlatformEvents{ 
3   // class implementation 
4}

この例では、一括処理トランザクションで失敗したアカウントを判断するトリガを作成します。カスタム項目 Dirty__c は、アカウントが失敗した一括処理のいずれかであったことを示し、ExceptionType__c は発生した例外を示します。JobScope と ExceptionType は、BatchApexErrorEvent オブジェクトの項目です。
1trigger MarkDirtyIfFail on BatchApexErrorEvent (after insert) {
2    Set<Id> asyncApexJobIds = new Set<Id>();
3    for(BatchApexErrorEvent evt:Trigger.new){
4        asyncApexJobIds.add(evt.AsyncApexJobId);
5    }
6    
7    Map<Id,AsyncApexJob> jobs = new Map<Id,AsyncApexJob>(
8        [SELECT id, ApexClass.Name FROM AsyncApexJob WHERE Id IN :asyncApexJobIds]
9    );
10    
11    List<Account> records = new List<Account>();
12    for(BatchApexErrorEvent evt:Trigger.new){
13        //only handle events for the job(s) we care about
14        if(jobs.get(evt.AsyncApexJobId).ApexClass.Name == 'AccountUpdaterJob'){
15            for (String item : evt.JobScope.split(',')) {
16                Account a = new Account(
17                    Id = (Id)item,
18                    ExceptionType__c = evt.ExceptionType,
19                    Dirty__c = true
20                );
21                records.add(a);
22            }
23        }
24    }
25    update records;
26}