Apex によるイベントメッセージの公開
Apex でのイベントの作成
イベントメッセージを公開する前に、プラットフォームイベントインスタンスを作成します。
イベント API 参照名を使用したイベントの作成:
Salesforce またはカスタムオブジェクトインスタンスを作成するのと同じ方法でイベントインスタンスを作成します。new 演算子とイベント API 参照名を使用します。
1// Create event
2Event_Name__e event = new Event_Name__e();
3// Set field values
4event.field1__c = 'value';
5...
6
7// Or create event with fields
8Event_Name__e event = new Event_Name__e(field1__c='value', …);EventUuid 項目が事前に入力されたイベントの作成:
標準の EventUuid 項目をイベント変数に事前に入力する場合は、Apex sobjectType.newSobject メソッドを使用してイベントを作成します。
EventUuid 項目には、イベントメッセージを識別するユニバーサル一意識別子 (UUID) が保持されます。EventUuid 項目を使用して、イベントメッセージの配信を追跡できます。詳細は、「Apex 公開コールバックを使用した非同期プラットフォームイベント公開の結果の取得」を参照してください。
1// Create event
2Event_Name__e event = (Event_Name__e)Event_Name__e.sObjectType.newSObject(null, true);
3// Set field values
4event.field1__c = 'value';
5...
6// Display the prepopulated EventUuid
7System.debug(‘EventUuid: ’ + event.EventUuid);イベントメッセージを公開するには、EventBus.publish メソッドをコールします。たとえば、[Low Ink (低インクレベル)] というカスタムプラットフォームイベントを定義している場合は、そのイベント種別を Low_Ink__e として参照します。次に、このイベントのインスタンスを作成して Apex メソッドに渡します。
例
この例は、種別 Low_Ink__e の 2 つのイベントを作成して公開した後、公開が成功したかエラーが発生したかを確認します。
このスニペットを実行する前に、Low_Ink__e という名前のプラットフォームイベントと、Text 型の Printer_Model__c 項目、Text 型の Serial_Number__c 項目 (必須としてマーク)、Number(16, 2) 型の Ink_Percentage__c 項目を定義します。
1List<Low_Ink__e> inkEvents = new List<Low_Ink__e>();
2inkEvents.add(new Low_Ink__e(Printer_Model__c='XZO-5', Serial_Number__c='12345',
3 Ink_Percentage__c=0.2));
4inkEvents.add(new Low_Ink__e(Printer_Model__c='MN-123', Serial_Number__c='10013',
5 Ink_Percentage__c=0.15));
6
7
8// Call method to publish events
9List<Database.SaveResult> results = EventBus.publish(inkEvents);
10
11// Inspect publishing result for each event
12for (Database.SaveResult sr : results) {
13 if (sr.isSuccess()) {
14 System.debug('Successfully published event.');
15 } else {
16 for(Database.Error err : sr.getErrors()) {
17 System.debug('Error returned: ' +
18 err.getStatusCode() +
19 ' - ' +
20 err.getMessage());
21 }
22 }
23}Database.SaveResult の即時の公開結果
各イベントの Database.SaveResult には、操作の成功とエラーの発生に関する情報が含まれます。isSuccess() メソッドが true を返した場合、公開要求は Salesforce のキューに入れられ、イベントメッセージが非同期で公開されます。詳細は、「大規模プラットフォームイベントの保持」を参照してください。isSuccess() が false を返す場合、イベント公開操作でエラーが発生しており、エラーは Database.Error オブジェクトに返されています。EventBus.publish() は、渡されたイベントを、エラーで公開できないものを除いて部分的に公開できます。EventBus.publish() メソッドは、失敗した公開操作による例外を発生させません。これは、Apex の Database.insert メソッドが部分的な完了オプションを指定してコールされたときの動作に似ています。
Database.SaveResult には、Id システム項目も含まれます。Id 項目値は、サブスクライバーに配信されるイベントメッセージには含まれません。これは、イベントメッセージの識別に使用されず、必ずしも一意ではありません。
非同期公開で返される状況コード
公開操作が非同期であることを示すため、Database.SaveResult の EventBus.publish コールが成功した場合は、OPERATION_ENQUEUED 状況コードがイベント UUID とともに返されます。状況コードとイベント UUID は、結果の成功を確認した後に取得できます。次の例は、公開コールが成功した後の Database.SaveResult の内容を出力したものです。Database.Error の getStatusCode メソッドは、OPERATION_ENQUEUED の状況コードを返します。getMessage メソッドは、公開されたイベントメッセージのイベント UUID 値を返します。
1Database.SaveResult[getErrors=(
2 Database.Error[getFields=();
3 getMessage=d65ae914-2488-414a-85d4-4df93ea9a05c;
4 getStatusCode=OPERATION_ENQUEUED;]);
5getId=e02xx0000000001AAA;isSuccess=true;]公開動作
プラットフォームイベントメッセージは、プラットフォームイベント定義で設定した公開動作に応じて、ただちに、またはトランザクションがコミットされた後に公開されます。詳細は、「プラットフォームイベント項目」を参照してください。Apex ガバナ制限が適用されます。[コミット後に公開] 動作で設定されたイベントの場合、各メソッドの実行は、Apex DML ステートメント制限に対して 1 つの DML ステートメントとして計数されます。利用制限は、Apex Limits.getDMLStatements() メソッドを使用して確認できます。[すぐに公開] 動作で設定されたイベントの場合、各メソッドの実行は、150 EventBus.publish() コールの個別のイベント公開制限に対して反映されます。利用制限は、Apex Limits.getPublishImmediateDML() メソッドを使用して確認できます。