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

検出されなかった例外発生後のプラットフォームイベントトリガの再開

イベントストリーム内にチェックポイントを設定し、プラットフォームイベントトリガが新しい呼び出しの実行をそこから再開できるようにします。Apex ガバナ制限に達した場合や別の検出されなかった例外が発生した場合は、トリガの新しい実行中にチェックポイントが使用されます。トリガ処理は、最後に成功したチェックポイントのイベントメッセージの後から再開します。また、1 回のトリガ実行で処理されるイベントの数を明示的に制御するようにチェックポイントを設定することもできます。ただし、メタデータ API または Tooling API を使用すると、トリガのバッチサイズをより簡単に設定できます。詳細は、「PlatformEventSubscriberConfig の使用によるプラットフォームイベントトリガのユーザおよびバッチサイズの設定」を参照してください。

処理するイベントメッセージ数が少ないほど、トリガは Apex ガバナ制限に達する可能性が低くなります。プラットフォームイベントトリガの最大バッチサイズは 2,000 で、Apex オブジェクトトリガの最大バッチサイズは 200 です。そのため、プラットフォームイベントトリガは制限に達する可能性がより高く、この機能によるメリットがあります。

トリガ再開のチェックポイントを設定するには、最後に正常に処理されたイベントメッセージの再実行 ID をこのメソッドのコールを使用して設定します。

1EventBus.TriggerContext.currentContext().setResumeCheckpoint(replayId);

トリガの実行フローが意図的に、または未処理の例外 (制限の例外など) によって停止すると、新しいバッチ (Trigger.New の sObject リスト) を使用して、トリガがもう一度起動します。新しいバッチは、設定した再実行 ID の後のイベントメッセージから開始します。イベントは、変化しない ReplayID 項目値に基づいて、最初の順番で再送信されます。トリガにより、再送信されるイベントと以���のバッチが順次処理されます。setResumeCheckpoint(replayId) メソッドによってトリガ実行は停止しませんが、明示的に実行を終了することができます。たとえば、バッチサイズを制御するには、一部のイベントメッセージが処理されたら実行フローを終了するようにします。

指定された再生 ID が有効でない場合、このメソッドでは EventBus.InvalidReplayIdException が発生します。無効な再生 ID は、Trigger.new リストのイベントの現在のトリガバッチにない再生 ID です。

1 つのトリガのバッチを再開しても、同じイベントオブジェクトの別のトリガには影響ありません。ただし、実行順序を保証することはできないため、同じオブジェクトで複数のトリガを設定するのはベストプラクティスではありません。そのため、オブジェクトごとに 1 つのトリガのみを追加することをお勧めします。

メモ

このトリガ例では、各反復の最後に処理されたイベントメッセージの再実行 ID を設定します。制限の例外が発生すると、トリガがもう一度起動し、設定された再実行 ID の後のイベントメッセージから処理が再開されます。

1trigger ResumeEventProcessingTrigger on Low_Ink__e (after insert) {
2    for (Low_Ink__e event : Trigger.New) {
3        // Process the event message. 
4        // ...        
5        
6        // Set the Replay ID of the last successfully processed event message. 
7        // If a limit is hit, the trigger refires and processing starts with the 
8        // event after the last one processed (the set Replay ID).
9        EventBus.TriggerContext.currentContext().setResumeCheckpoint(event.replayId);
10    }
11}

この例では、プラットフォームイベントトリガのバッチサイズを制御し、Apex オブジェクトトリガのバッチサイズ 200 に一致させます。このトリガは、すでに処理済みのイベントメッセージの数を数えます。setResumeCheckpoint(replayId) は、正常に処理された各イベントメッセージの後でループの各反復でコールされます。イベント数が 200 件を超えるとループが終了し、トリガの実行が停止されます。未処理のイベントメッセージがある場合、トリガは再度起動します。新しいトリガ呼び出しに送信されたイベントメッセージのリストは、設定された再実行 ID のイベントメッセージの後のイベントメッセージで開始されます。

API バージョン 51.0 以降、メタデータ API または Tooling API の PlatformEventSubscriberConfig を使用してトリガのバッチサイズを設定できます。詳細は、「PlatformEventSubscriberConfig の使用によるプラットフォームイベントトリガのユーザおよびバッチサイズの設定」を参照してください。

メモ

1trigger ControlBatchSizeTrigger on Low_Ink__e (after insert) {
2    Integer counter = 0;
3    for (Low_Ink__e event : Trigger.New) {
4      // Increase batch counter.
5      counter++;
6      // Only process the first 200 event messages
7      if (counter > 200) {
8        // Resume after the last successfully processed event message
9        // after the trigger stops running. 
10        // Exit for loop.
11        break;
12      }
13
14      // Process event message.
15      // ....
16
17      // Set Replay ID after which to resume event processing 
18      // in new trigger execution.
19      EventBus.TriggerContext.currentContext().setResumeCheckpoint(
20          event.ReplayId);
21    }
22}

TestBatchSizeTriggerResumption テストクラスには ControlBatchSizeTrigger のテストが含まれます。クラスのテストメソッドは 201 件のイベントメッセージを公開します。次に、deliver() メソッドを 2 回コールしてトリガを 2 回起動します。最初の呼び出しは、200 件のイベントメッセージを処理します。2 番目の呼び出しは、最後のイベントメッセージを処理します。このテストでは、最後に処理されたイベントメッセージの再実行 ID を保持する EventBusSubscriber.Position プロパティを調査してトリガが呼び出されたことを検証します。

1@isTest
2public class TestBatchSizeTriggerResumption {
3
4    @isTest static void testResumingBatchSizeTrigger() {
5
6        Test.startTest();
7        
8        // Publish 201 test events
9        List<Low_Ink__e> eventList = new List<Low_Ink__e>();
10        for(Integer i=0;i<201;i++) {
11            Low_Ink__e oneEvent = new Low_Ink__e(Serial_Number__c='X-' + i);
12            eventList.add(oneEvent);
13        }
14        Database.SaveResult[] srs = EventBus.publish(eventList);
15        for(Database.SaveResult sr : srs) {
16            System.assertEquals(true, sr.isSuccess());
17        }
18
19        
20        // Deliver the first 200 test event messages.
21        // This will fire the associated event trigger.
22        Test.getEventBus().deliver(); 
23        
24        // Get old position of this subscriber
25        EventBusSubscriber subOld = 
26            [SELECT Name, Position, Topic 
27             FROM EventBusSubscriber 
28             WHERE Topic='Low_Ink__e' AND Name='ControlBatchSizeTrigger'];
29        System.debug(subOld);
30        
31        // Refire the trigger for the last event (201st).    
32        Test.getEventBus().deliver(); 
33        
34        // VERIFICATION
35        // Get new position of this subscriber
36        EventBusSubscriber subNew = 
37            [SELECT Name, Position, Topic
38             FROM EventBusSubscriber 
39             WHERE Topic='Low_Ink__e' AND Name='ControlBatchSizeTrigger'];
40        System.debug(subNew);
41                
42        System.assertEquals(subOld.Position + 1, subNew.Position);
43        
44        Test.stopTest();    
45
46    }
47}