Apex 一括処理からのプラットフォームイベントの起動
Apex 一括処理クラスは、エラーまたは例外が発生したときにプラットフォームイベントを起動できるようになりました。イベントをリスンしているクライアントは、実用的な情報 (イベントの失敗頻度や失敗時に範囲内にあったレコードなど) を取得できます。イベントは、Salesforce Platform 内部エラーや、ガバナ制限に達したために発生する LimitExceptions などのキャッチできない Apex 例外でも起動されます。
イベントメッセージでは、Apex ジョブ UI よりも詳細なエラーの追跡情報が提供されます。イベントレコードには処理中のレコード ID、例外種別、例外メッセージ、スタック追跡が含まれます。失敗のカスタム処理と再試行ロジックを組み込むこともできます。カスタム Apex ロジックは、この種のイベントの任意のトリガから呼び出すことができるため、Apex 開発者はカスタムロギングや自動再試行処理などの機能を構築できます。
プラットフォームイベントの登録については、「プラットフォームイベントの登録」を参照してください。
BatchApexErrorEvent オブジェクトは、Apex 一括処理クラスに関連付けられているプラットフォームイベントを表します。このオブジェクトは API バージョン 44.0 以降で使用できます。Apex の一括処理ジョブの start、execute、または finish メソッドで未対応の例外が発生すると、BatchApexErrorEvent プラットフォームイベントが発生します。詳細は、「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}