プラットフォームイベントの定義および公開
学習の目的
プラットフォームイベントの定義および公開
プラットフォームイベントの概要とそのユースケースを理解できたので、実際にプラットフォームイベントを定義してみましょう。Cloud News 通信社を覚えていますか? ニュースイベントのデータを保持するプラットフォームイベント定義を作成しましょう。
次の手順で Cloud News という名前のプラットフォームイベントを定義します。
- [設定] から、[クイック検索] ボックスに「プラットフォームイベント」と入力し、[プラットフォームイベント] を選択します。
- [プラットフォームイベント] ページで、[新規プラットフォームイベント] をクリックします。
- [表示ラベル] に、「Cloud News」と入力します。
- [表示ラベル(複数形)] に、「Cloud News」と入力します。
- [説明] に、「Cloud news events deliver news at your fingertips (Cloud News イベントで簡単にニュースを配信)」と入力します。
- [公開動作] は、デフォルトの [コミット後に公開] のままにします。
- [保存] をクリックします。
- [カスタム項目 & リレーション] 関連リストで、[新規] をクリックします。
- [テキスト] を選択し、[次へ] をクリックします。
- [項目の表示ラベル] と [項目名] に「Location (場所)」と入力します。
- [長さ] に「100」と入力します。その他の項目はデフォルトのままにし、[説明] 項目は空白のままにします。[保存] をクリックします。
- ステップ 7、8、9 を繰り返して次の 2 つの項目を追加します。
項目の表示ラベル/名前 データ型 緊急 チェックボックス News Content テキストエリア (ロング)
定義した Cloud News イベントでは、テキスト項目やチェックボックスなど、さまざまなデータ型の項目を作成しました。プラットフォームイベントでサポートされるのは次のデータ型です。
- チェックボックス
- 日付
- 日付/時間
- 数値
- テキスト
- テキストエリア (ロング)
イベント保持と ReplayId システム項目
Salesforce では、大規模プラットフォームイベントが 72 時間保存されます。Spring ’19 以前に定義された標準規模のイベントは 24 時間保存されます。
保存されたイベントは API CometD クライアントまたは Pub/Sub API クライアントを使用してイベントバスから取得できます。保存されたイベントをすべて取得することも、イベントの再実行 ID をイベントの取得部分の基準として指定することもできます。Apex トリガーでは、サスペンド状態のトリガーを再開し、保持された最も古い未処理イベントを取得できます。このモジュールの後半で、Apex トリガー登録の管理方法について学習します。
Salesforce はイベントメッセージを一時的に保持していますが、SOQL や SOSL を使用したクエリはできません。同様に、レポート、リストビュー、検索のユーザーインターフェースでイベントメッセージを使用することはできません。過去のイベントを取得するには、CometD で登録するか、ReplayId オプションを使用する必要があります。イベントへの登録方法は、次の単元で説明します。
各イベントメッセージには、ReplayId 項目に含まれる不透明な ID が割り当てられます。ReplayId 項目値は、イベントが登録者に配信されるときにシステムによって入力され、イベントストリーム内のイベントの位置を参照します。連続するイベントの再実行 ID 値が連番になるという保証はありません。登録者は、再実行 ID 値を保存し、その ID を再登録で使用して保持期間内のイベントを取得することができます。たとえば、登録者は接続障害が発生した後に、欠落イベントを取得できます。登録者が、保存された再実行 ID に基づいて新しい再実行 ID を計算し、ストリーム内の他のイベントを参照することはできません。
API 参照名サフィックス
プラットフォームイベントを作成するときに、システムにより __e サフィックスが付加されてイベントの API 参照名が作成されます。たとえば、Cloud News イベントの場合、API 参照名は Cloud_News__e になります。Apex、REST API、Enterprise API など、プログラムでイベントを参照する場合は常に API 参照名を使用します。
プラットフォームイベントとトランザクション
[コミット後に公開] 公開動作を定義したプラットフォームイベントはトランザクションに左右され、ロールバックできますが、[すぐに公開] 公開動作を定義したプラットフォームイベントはトランザクションに左右されず、ロールバックできません。動作には次の違いがあります。
コミット後に公開の動作
[コミット後に公開] 動作を定義したプラットフォームイベントは、トランザクションが正常にコミットされた後にのみ公開されます。公開トランザクションがコミットするデータに登録者が依存している場合は、イベントにこのオプションを定義します。たとえば、あるプロセスがイベントメッセージを公開し、ToDo レコードを作成するとします。そのイベントに登録している 2 つ目のプロセスは起動したときに ToDo レコードがあることを想定しています。この動作を選択する別の理由として、トランザクションが失敗したときにイベントメッセージを公開したくない場合があります。
すぐに公開の動作
[すぐに公開] 動作を定義したプラットフォームイベントは、公開コールが実行されたときに公開されます。トランザクションが成功したかどうかに関係なくイベントメッセージが公開されるようにする場合は、このオプションを選択します。また、公開者と登録者が独立していて、公開者がコミットするデータに登録者が依存していない場合もこのオプションを選択します。たとえば、記録目的で使用されるイベントにはすぐに公開する動作が適しています。このオプションを選択した場合、データが公開者のトランザクションによってコミットされる前に登録者がイベントメッセージを受信することがあります。
イベントの公開
アプリケーションが Salesforce プラットフォーム上にある場合、Apex メソッドを使用するか、Flow Builder 宣言型ツールを使用してイベントを公開できます。アプリケーションが外部アプリケーションの場合、Salesforce API を使用してイベントを公開できます。
Apex を使用したイベントメッセージの公開
イベントメッセージを公開するには、イベントのインスタンスを作成して EventBus.publish()
メソッドに渡します。
次の例では、種別が Cloud_News__e
のイベントを 1 つ作成して公開し、公開が成功したか、エラーが発生したかをチェックします。EventBus.publish()
メソッドは、公開の結果が含まれる Database.SaveResult
オブジェクトを返します。isSuccess()
が true
を返したら、公開要求が Salesforce のキューに配置され、イベントメッセージが非同期で公開されます。isSuccess()
が false
を返したら、イベント公開操作でエラーが発生しました。このエラーは、Database.Error
オブジェクトで返されます。このメソッドは、失敗した公開操作による例外を発生させません。
開発者コンソールで Apex コードスニペットを実行できます。
- クイックアクセスメニュー (
) から、[開発者コンソール] を選択します。
- [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- 新しいウィンドウで、コンテンツをコードスニペットに置き換えてから [Execute (実行)] をクリックします。
// Create an instance of the event and store it in the newsEvent variable Cloud_News__e newsEvent = new Cloud_News__e( Location__c='Mountain City', Urgent__c=true, News_Content__c='Lake Road is closed due to mudslides.'); // Call method to publish events Database.SaveResult sr = EventBus.publish(newsEvent); // Inspect publishing result if (sr.isSuccess()) { System.debug('Successfully published event.'); } else { for(Database.Error err : sr.getErrors()) { System.debug('Error returned: ' + err.getStatusCode() + ' - ' + err.getMessage()); } }
同じコールで複数のイベントを公開するには、イベントのリストにイベントを追加し、リストを EventBus.publish()
メソッドに渡します。このメソッドの出力は、Database.SaveResult
オブジェクトの配列です (公開されたイベントごとにオブジェクトが 1 つずつ)。EventBus.publish()
は、渡されたイベントを、エラーで公開できないものを除いて部分的に公開できます。EventBus.publish()
メソッドは、失敗した公開操作による例外を発生させません。これは、Apex の Database.insert()
メソッドが部分的な完了オプションを指定してコールされたときの動作に似ています。
// List to hold event objects to be published. List<Cloud_News__e> newsEventList = new List<Cloud_News__e>(); // Create event objects. Cloud_News__e newsEvent1 = new Cloud_News__e( Location__c='Mountain City', Urgent__c=true, News_Content__c='Lake Road is closed due to mudslides.'); Cloud_News__e newsEvent2 = new Cloud_News__e( Location__c='Mountain City', Urgent__c=false, News_Content__c='Small incident on Goat Lane causing traffic.'); // Add event objects to the list. newsEventList.add(newsEvent1); newsEventList.add(newsEvent2); // Call method to publish events. List<Database.SaveResult> results = EventBus.publish(newsEventList); // Inspect publishing result for each event for (Database.SaveResult sr : results) { if (sr.isSuccess()) { System.debug('Successfully published event.'); } else { for(Database.Error err : sr.getErrors()) { System.debug('Error returned: ' + err.getStatusCode() + ' - ' + err.getMessage()); } } }
クリック操作を使用したイベントメッセージの公開
コーディングなしでイベントメッセージを公開するには、Flow Builder でレコード作成機能を使用します。プラットフォームイベントのインスタンス (Cloud_News__e
) を作成するように [レコード作成] 要素を設定し、イベントの値を設定します。Urgent__c
など Boolean 項目の値を設定するには、{!$GlobalConstant.True}
を使用します。
Salesforce API を使用したイベントメッセージの公開
外部アプリケーションは API を使用してプラットフォームイベントメッセージを公開します。イベントを公開するには、sObject を挿入するのと同じ方法でイベントレコードを作成します。SOAP API、REST API、Bulk API などの Salesforce API を使用して、プラットフォームイベントメッセージを作成できます。Apex の場合と同様に、イベントメッセージは非同期で公開されます。イベントを公開し、true
の成功状況が取得されると、公開要求が Salesforce のキューに配置されます。
たとえば、Cloud News イベントの場合、Cloud_News__e
レコードを挿入してイベント通知を公開できます。次の例では REST API で種別 Cloud_News__e
のイベントを 1 つ作成します。
sObject REST エンドポイント:
POST 要求のリクエストボディ:
プラットフォームイベントメッセージが作成された後、REST 応答は次の出力のようになります。
REST API コールを行うには、REST API ツールまたは HTTP クライアントアプリケーションを使用できます。たとえば、次の手順に従って Postman を使用できます。これまで Postman を使用したことがない場合は、「Quick Start: Connect Postman to Salesforce (クイックスタート: Postman を Salesforce に接続する)」プロジェクトにアクセスして、Salesforce APIs コレクションを設定、フォークしてください。Postman についての詳細は、「リソース」セクションを参照してください。
DE 組織を Postman に接続する。
- Trailhead DE 組織にログインします。
- Postman アプリケーションを開き、ワークスペースを選択し、Salesforce API コレクションのフォークに移動します。
- [Authorization (認証)] タブで、最下部までスクロールして [Get New Access Token (新しいアクセストークンを取得)] をクリックします。
- [許可] をクリックします。
- [Manage Access Tokens (アクセストークンを管理)] ダイアログで、[instance URL (インスタンス URL)] をクリップボードにコピーします。
- [Use Token (トークンを使用)] をクリックします。
- [Variables (変数)] タブで [_endpoint] 行の [CURRENT VALUE] 列に、コピーしたインスタンス URL を貼り付け、[Save (保存)] をクリックします。ドキュメントペインを閉じないと、[Save (保存)] ボタンが表示されない場合があります。
- 接続が機能していることをテストします。
- コレクションで、Salesforce APIs コレクションのフォークを選択します。
- [REST] を選択して、REST APIs を展開します。
- [GET Limits] を選択して、[Send (送信)] をクリックします。
- 応答ウィンドウの [Status (状況)] 項目に [Status: 200 OK] と表示されるはずです。表示されない場合は、ステップを繰り返して新しいトークンを取得します。
REST API コールを実行し、イベント通知を公開する。
- Salesforce APIs コレクションのフォークで、[REST] をクリックします。
- [sObject] をクリックして展開します。
- [POST SObject Create] をクリックします。
-
{{_Endpoint}}
の後の URI を次の値に置き換えます。/services/data/v53.0/sobjects/Cloud_News__e
-
[Body (ボディ)] タブで、次の詳細を貼り付けます。
{ "Location__c" : "Mountain City", "Urgent__c" : true, "News_Content__c" : "Lake Road is closed due to mudslides." }
-
[Save (保存)] をクリックして、[Send (送信)] をクリックします。イベントの投稿後に Salesforce が返す応答は次のようになります。
{ "id" : "e00xx0000000001AAA", "success" : true, "errors" : [ { "statusCode": "OPERATION ENQUEUED", "message": "08ffc869-b9f8-4cff-a4ba-8dff9b3dd6cb", "fields": [] } ] }
または、SOAP API で create()
コールを使用するか、Bulk API で一括処理ジョブを使用してイベントを公開できます。Pub/Sub API を使用してイベントメッセージを公開することもできます。これは、イベントメッセージへの登録にも Pub/Sub API を使用している場合には便利です。詳細は Pub/Sub API のドキュメントを参照してください。
イベントの定義および公開方法を確認できたので、次は登録方法を学習しましょう。
リソース
- ストリーミング API 開発者ガイド: メッセージの永続性
- Platform Events Developer Guide (プラットフォームイベント開発者ガイド): Platform Event Limits (プラットフォームイベントの割り当て)
- Apex 開発者ガイド: 実行ガバナと制限
- Salesforce ヘルプ: フロー
- Trailhead: Quick Start: Connect Postman to Salesforce (クイックスタート: Postman を Salesforce に接続する)
- 外部ヘルプ: Postman 学習センター
- REST API 開発者ガイド
- SOAP API 開発者ガイド
- Bulk API 開発者ガイド