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

Apex トリガによるプラットフォームイベント通知の登録

Apex トリガを使用してイベントを登録します。イベント通知がどのような方法 (Apex または API) で公開されたかにかかわらず、トリガでイベント通知を受信できます。トリガは自動登録メカニズムを提供します。Apex でチャネルを明示的に作成し、そのチャネルをリスンする必要はありません。

イベント通知を登録するには、イベントオブジェクト種別で after insert トリガを記述します。after insert トリガイベントは、プラットフォームイベントの公開後の時点に対応します。イベントメッセージの公開後に、after insert トリガが起動されます。

この例は [Low Ink (低インクレベル)] イベントのトリガを示しています。これは、イベントを 1 つずつ反復処理して Printer_Model__c 項目値を確認します。トリガは受信した各通知を調べて、通知からプリンタモデルを取得します。プリンタモデルが特定の値に一致する場合、他のビジネスロジックを実行します。たとえば、このプリンタモデルの新しいカートリッジを注文するためのケースをトリガで作成します。

1// Trigger for catching Low_Ink events.
2trigger LowInkTrigger on Low_Ink__e (after insert) {    
3    // List to hold all cases to be created.
4    List<Case> cases = new List<Case>();
5    
6    // Get user Id for case owner. Replace username value with a valid value.
7    User adminUser = [SELECT Id FROM User WHERE Username='admin@acme.org'];
8       
9    // Iterate through each notification.
10    for (Low_Ink__e event : Trigger.New) {
11        System.debug('Printer model: ' + event.Printer_Model__c);
12        if (event.Printer_Model__c == 'MN-123') {
13            // Create Case to order new printer cartridge.
14            Case cs = new Case();
15            cs.Priority = 'Medium';
16            cs.Subject = 'Order new ink cartridge for SN ' + event.Serial_Number__c;
17            // Optional: Set case owner ID so it is not Automated Process.
18            // This step is not needed if the running user is overridden 
19            // or if using assignment rules.
20            cs.OwnerId = adminUser.Id;
21            cases.add(cs);
22        }
23    }
24    
25    // Insert all cases in the list.
26    if (cases.size() > 0) {
27        insert cases;
28    }
29}

Apex トリガは、プラットフォームイベント通知を、受信した順序で順次処理します。イベントの順序はイベントの再実行 ID に基づきます。Apex トリガはイベントのバッチを一度に受信できます。プラットフォームイベントトリガの最大バッチサイズは 2,000 件のイベントメッセージです。イベントの順序は各バッチ内で保持されます。バッチ内のイベントは 1 つまたは複数の公開者から取得できます。

プラットフォームイベントのトリガは、標準またはカスタムオブジェクトのトリガとは異なり、イベントを公開した Apex トランザクションと同じ Apex トランザクションで実行されません。トリガは、独自のプロセス内で非同期で実行されます。このため、イベントが公開されてからトリガでイベントが処理されるまで、遅延が発生する場合があります。

トリガは、自動化プロセスエンティティまたはトリガ設定で選択したユーザの下で実行されます。ユーザが設定されていない場合、トリガの実行に対応するデバッグログが自動化プロセスにより作成されます。CreatedByIdLastModifiedById などのシステム項目は、自動化プロセスエンティティを参照します。デバッグログとレコードのユーザが選択済みのユーザに設定されるように、トリガのデフォルトの実行ユーザを上書きできます。詳細は、「Configure the User and Batch Size for Your Platform Event Trigger (プラットフォームイベントトリガのユーザおよびバッチサイズの設定)」を参照してください。

トリガに保存された OwnerId 項目はトリガの実行ユーザに設定されます。デフォルトでは自動化プロセスに設定されています。OwnerId を変更する方法についての詳細は、「Apex および API を使用したプラットフォームイベントの公開および登録に関する考慮事項」を参照してください。

メモ

イベントトリガの多くの制限は、カスタムおよび標準オブジェクトのトリガの制限と同じです。たとえば、一部の例外を除いて、一般にトリガから Apex コールアウトを実行できません。詳細は、『Apex 開発者ガイド』「トリガ」の「実装に関する考慮事項」を参照してください。

プラットフォームイベントトリガおよび検出されなかった例外

トリガの実行中に検出されなかった例外が発生すると、トリガの実行が停止し、現在のバッチ内にある残りのイベントメッセージは処理されません。検出されなかった例外は、catch ブロックまたは制限の例外でトリガによって処理されない例外です。トリガの Apex 実行時間制限を超えない限り、検出されなかった例外の発生より前に実行された DML 操作はコミットされ、ロールバックされません。DML トランザクションをコミットすると、setResumeCheckpoint() メソッドを使用して、停止した場所からトリガの実行を続行できます。このメソッドでは、トリガが再開し、前のバッチから未処理のイベントメッセージが選択されます。詳細は、「検出されなかった例外発生後のプラットフォームイベントトリガの再開」を参照してください。

DML トランザクションは、次の場合にのみロールバックされます。

  • トリガで EventBus.RetryableException が発生した場合。
  • トリガの Apex 実行時間制限が制限時間の 10 分を超えた場合。各 Apex トランザクションの最大実行時間については、『Apex 開発者ガイド』「実行ガバナと制限」を参照してください。

プラットフォームイベントトリガおよび Apex ガバナ制限

プラットフォームイベントトリガには Apex ガバナ制限が適用されます。

同期ガバナ制限
同期と非同期の Apex でガバナ制限が異なる場合、同期制限がプラットフォームイベントトリガに適用されます。非同期制限は、Apex 一括処理や将来のメソッドなど、長時間プロセスを対象とします。同期制限は、高速で実行される短時間プロセスを対象とします。プラットフォームイベントトリガは非同期で実行されますが、どちらかといえば高速で一括で実行される短時間プロセスです。
制限のリセット
プラットフォームイベントトリガは、それを起動したトランザクションとは別のトランザクションで実行されるため、ガバナ制限はリセットされ、トリガには独自の制限セットが適用されます。