EventUuid 項目を使用したイベントメッセージの識別と照合
EventUuid 項目は、ユニバーサル一意識別子 (UUID) で、API バージョン 52.0 以降から使用できます。API バージョンは、Apex トリガを保存するときに使用したバージョン、または CometD 登録���エンドポイントに指定されたバージョンに一致します。EventUuid 項目は、イベントスキーマの一部ではありません。REST eventSchema リソースまたは describe コールの結果によって返されます。EventUuid 項目は、大規模プラットフォームイベントと標準量プラットフォームイベントで使用できます。
イベント公開は非同期です。すぐに返された SaveResult に含まれている成功の状況は、公開操作が Salesforce のキューに登録されたことを意味します。操作は、後でシステムリソースが使用可能になったときに実行されます。検証や制限のエラーなど、一部の失敗は SaveResult に返されますが、非同期エラーは返されません。まれに、キューに登録された公開操作がシステムエラーにより失敗し、イベントメッセージが配信されないことがあります。EventUuid 項目を使用して、キューに登録されたイベントメッセージのうちどれが公開に失敗したかを判断して再公開できます。
公開されたイベントメッセージのイベント UUID の取得
公開されたイベントメッセージと受信されたイベントメッセージの UUID を比較する前に、まずは公開されたイベントメッセージの UUID を保存します。また、対応するイベント項目値も保存し、イベントを必要に応じて再公開できるようにします。
Salesforce API を使用してイベントを公開した場合、返された SaveResult のエラーの message 項目に UUID が含まれます。次の例には、REST API POST 要求を使用して挿入されたイベントの保存結果が含まれます。
1{
2 "id" : "e01xx0000000001AAA",
3 "success" : true,
4 "errors" : [ {
5 "statusCode" : "OPERATION_ENQUEUED",
6 "message" : "e981b488-81f3-4fcc-bd6f-f7033c9d7ac3",
7 "fields" : [ ]
8 } ]
9}Apex でイベントを公開した場合、EventBus.getOperationId(saveResult) メソッドをコールして UUID を取得できます。
この例では、Apex を使用してイベント公開コールから UUID を取得します。
前提条件: この例を実行する前に、Order Event (注文イベント) の表示ラベルが付いているプラットフォームイベントと、Text(10) 型の Order Number (注文番号) 項目および Checkbox 型の Has Shipped (発送済み) 項目を定義します。
1// Publish a high-volume event message
2Order_Event__e evt = new Order_Event__e(
3 Order_Number__c='17',
4 Has_Shipped__c = false);
5Database.SaveResult sr = EventBus.publish(evt);
6// Inspect immediate result
7if (sr.isSuccess() == true) {
8 System.debug('Successfully enqueued event for publishing.');
9 // Get the UUID that uniquely identifies this event publish
10 System.debug('UUID=' + EventBus.getOperationId(sr));
11} else {
12 for(Database.Error err : sr.getErrors()) {
13 System.debug('Error returned: ' +
14 err.getStatusCode() +
15 ' - ' +
16 err.getMessage());
17 }
18}
19
20// Debug message output:
21//|DEBUG|Successfully enqueued event for publishing.
22//|DEBUG|UUID=6ba5db7e-c27b-4a67-a3c5-cf425ffcaf53CometD クライアントで受信されたイベントメッセージからのイベント UUID の取得
CometD クライアントで受信されたイベントメッセージでは、次の JSON イベントの例に示すように、イベントオブジェクトの EventUuid 項目にイベント UUID が含まれています。
1{
2 "schema": "UIovjRagY-xEDIJ1Ehzafg",
3 "payload": {
4 "CreatedDate": "2021-03-04T18:31:40.517Z",
5 "CreatedById": "005RM00000231cZYAQ",
6 "Order_Number__c": "17",
7 "Has_Shipped__c": false
8 },
9 "event": {
10 "EventUuid": "e981b488-81f3-4fcc-bd6f-f7033c9d7ac3",
11 "replayId": 617
12 }
13}Apex トリガを使用した受信イベントメッセージからのイベント UUID の取得
Apex トリガでは、イベントオブジェクトの EventUuid 項目にアクセスすることによってイベント UUID を抽出します。
1trigger OrderEventTrigger on Order_Event__e (after insert) {
2 for(Order_Event__e evt: Trigger.New) {
3 // Get the event UUID
4 String EventUuid = evt.EventUuid;
5 System.debug('Received event UUID=' + EventUuid);
6
7 // Store the event UUID for matching with published event UUID
8 // . . .
9 }
10}
11
12// Debug message output:
13//|DEBUG|Received event UUID=6ba5db7e-c27b-4a67-a3c5-cf425ffcaf53公開されたイベントメッセージと受信されたイベントメッセージの UUID の照合
公開されたイベントメッセージと受信されたイベントメッセージの両方のイベント UUID を取得したら、それらの UUID を照合します。UUID が一致しない場合は、そのイベントが配信されていない可能性があります。一致しないイベントメッセージは再公開を試みることができます。