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 トランザクションで実行されません。トリガーは、独自のプロセス内で非同期で実行されます。このため、イベントが公開されてからトリガーでイベントが処理されるまで、遅延が発生する場合があります。
トリガーは、自動化プロセスエンティティまたはトリガー設定で選択したユーザーの下で実行されます。ユーザーが設定されていない場合、トリガーの実行に対応するデバッグログが自動化プロセスにより作成されます。CreatedById や LastModifiedById などのシステム項目は、自動化プロセスエンティティを参照します。デバッグログとレコードのユーザーが選択済みのユーザーに設定されるように、トリガーのデフォルトの実行ユーザーを上書きできます。詳細は、「PlatformEventSubscriberConfig の使用によるプラットフォームイベントトリガーのユーザーおよびバッチサイズの設定」を参照してください。
イベントトリガーの多くの制限は、カスタムおよび標準オブジェクトのトリガーの制限と同じです。たとえば、一部の例外を除いて、一般にトリガーから Apex コールアウトを実行できません。詳細は、『Apex 開発者ガイド』の「トリガー」の「実装に関する考慮事項」を参照してください。
プラットフォームイベントトリガーおよび検出されなかった例外
トリガーの実行中に検出されなかった例外が発生すると、トリガーの実行が停止し、現在のバッチ内にある残りのイベントメッセージは処理されません。検出されなかった例外は、catch ブロックまたは制限の例外でトリガーによって処理されない例外です。トリガーの Apex 実行時間制限を超えない限り、検出されなかった例外の発生より前に実行された DML 操作はコミットされ、ロールバックされません。DML トランザクションをコミットすると、setResumeCheckpoint() メソッドを使用して、停止した場所からトリガーの実行を続行できます。このメソッドでは、トリガーが再開し、前のバッチから未処理のイベントメッセージが選択されます。詳細は、「検出されなかった例外発生後のプラットフォームイベントトリガーの再開」を参照してください。
DML トランザクションは、次の場合にのみロールバックされます。
- トリガーで EventBus.RetryableException が発生した場合。
- トリガーの Apex 実行時間制限が制限時間の 10 分を超えた場合。各 Apex トランザクションの最大実行時間については、『Apex 開発者ガイド』の「実行ガバナと制限」を参照してください。
プラットフォームイベントトリガーおよび Apex ガバナ制限
プラットフォームイベントトリガーには Apex ガバナ制限が適用されます。
- 同期ガバナ制限
- 同期と非同期の Apex でガバナ制限が異なる場合、同期制限がプラットフォームイベントトリガーに適用されます。非同期制限は、Apex 一括処理や将来のメソッドなど、長時間プロセスを対象とします。同期制限は、高速で実行される短時間プロセスを対象とします。プラットフォームイベントトリガーは非同期で実行されますが、どちらかといえば高速で一括で実行される短時間プロセスです。
- 制限のリセット
- プラットフォームイベントトリガーは、それを起動したトランザクションとは別のトランザクションで実行されるため、ガバナ制限はリセットされ、トリガーには独自の制限セットが適用されます。