Apex でのプラットフォームイベントの公開に関するトラブルシューティング
学習の目的
この単元を完了すると、次のことができるようになります。
- 公開コールから取得できる 2 種類の結果について説明する。
- 公開コールから返される同期エラーを取得する。
- エラーをデバッグログに記録し、デバッグログでエラーを確認する。
- Apex 公開コールバックとは何かを説明する。
始める前に
このモジュールには、高度な Apex プログラミングスキルが必要です。始める前に、Apex とプラットフォームイベントについて確実に理解しておいてください。これらの学習には以下のリソースが役立ちます。
-
Platform Events Basics (プラットフォームイベントの基本) モジュール
-
Apex Testing: Write Unit Tests (Apex のテスト: 単体テストを記述する) モジュール
Cloud Kicks - プラットフォームイベントを使用して注文を処理
Cloud Kicks は、スニーカーのカスタマイズ注文に対応している小売業者です。Cloud Kicks で開発を担当する Vijay Lahiri は、スニーカーの注文を処理するアプリケーションの作成を任されています。Vijay は、お客様からの注文に対してプラットフォームイベントを公開します。(非同期エラーによってイベントの公開が失敗した場合の処理については、次の単元で説明します。)
注文処理の最初のステップは、受けた注文に対してプラットフォームイベントを公開することです。プラットフォームイベントを公開すると、サブスクライバーアプリケーションがイベントを受信し、注文を非同期で処理できるようになります。プラットフォームイベントをリスンして注文を処理すると、大量の注文にも対応しやすくなります。この単元では、プラットフォームイベントの公開が非同期であることと、公開コールから返される同期エラーと非同期結果をどのように区別するかを説明します。

公開の中間結果と最終結果
Apex では、 EventBus.publish メソッドを使用してプラットフォームイベントを公開します。イベントの公開は非同期に実行されます。イベントを公開すると、そのイベントは Salesforce でキューに追加され、システムリソースが使用可能になった時点で後から公開されます。公開コールの実行直後に返される結果は、そのイベントをキューに追加した中間結果です。公開コールに問題がある場合は、同期的に即時エラーが返されることがあります。たとえば、必須項目が欠けた状態でイベントを公開すると、エラーが返されます。公開コールを修正して、公開を再び試すことができます。
即時結果は、Database.SaveResult で返されます。Database.SaveResult の isSuccess メソッドが true を返した場合、その公開要求は Salesforce でキューに追加され、イベントメッセージは非同期で公開されます。isSuccess が false を返したら、イベント公開操作でエラーが発生し、Database.Error オブジェクトでエラーが返されます。
Trailhead Playground を今すぐ起動する
この単元にはハンズオン Challenge はありませんが、自分専用の Trailhead Playground で手順を追いながら試すことができます。次の単元でハンズオン Challenge を完了するときにも、この Playground を使用します。
Playground を起動する前に、Trailhead にログインしていることを確認してください。次に、このページの右上にあるユーザーアバターをクリックして、ドロップダウンから [ハンズオン組織] をクリックします。開く組織の横にある [起動] をクリックします。または、新しい Playground を作成する場合は、[Playground を作成] をクリックします。
プラットフォームイベントの定義
このモジュールの例は、Order Event (注文イベント) というサンプルのプラットフォームイベントに基づいています。例を保存して実行する場合は、このイベントを作成してください。次の単元のハンズオン Challenge では、Order Shipping Event (注文配送イベント) という別のプラットフォームイベントを使用します。ハンズオン Challenge を実施するときは、Order Shipping Event (注文配送イベント) とその Order Id (注文 ID) 項目について、以下の手順を参照してください。
- [Setup (設定)] から、[Quick Find (クイック検索)] ボックスに
Platform Events(プラットフォームイベント) と入力し、[Platform Events (プラットフォームイベント)] を選択します。
- [プラットフォームイベント] ページで、[新規プラットフォームイベント] をクリックします。
- [Label (表示ラベル)] に、
Order Event(注文イベント) と入力します。
- [Plural Label (表示ラベル(複数形))] に、「
Order Events」(注文イベント) と入力します。
- 使用できる場合は、[Starts with vowel sound (母音で始まる場合はチェック)] を有効にします。
- [Description (説明)] には、「
Order events contain order data and are received by order processing apps」(注文イベントには注文データが含まれ、注文処理アプリケーションが受信します) と入力します。
-
[保存] をクリックします。
- [カスタム項目 & リレーション] 関連リストで、[New (新規)] をクリックします。
- ウィザードに従って、以下の項目を追加します。
項目の表示ラベル/名前 |
項目の型 |
Required? (必須?) |
|---|---|---|
Amount (金額) |
Number(16, 2) |
不要 |
注文 ID |
テキスト (18) |
必要 |
返された即時エラーを確認する
必須の Order_Id 項目を指定せずに 1 件のイベントを公開して、デバッグログに出力されるエラーを確認してみましょう。
開発者コンソールで Apex コードスニペットを実行できます。
- 開発者コンソールを開くには、クイックアクセスメニュー (
) をクリックしてから、[Developer Console (開発者コンソール)] をクリックします。
-
[Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- 新しいウィンドウで、既存の内容をすべてコードスニペットに置き換え、[Open Log (ログを開く)] チェックボックスをオンにして、[Execute (実行)] をクリックします。
// Create an instance of the event and store it in the orderEvent variable
// Omit the OrderId field to get an error
Order_Event__e orderEvent = new Order_Event__e(
Amount__c=150);
// Call method to publish events
Database.SaveResult sr = EventBus.publish(orderEvent);
// 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());
}
}開いたログファイルには、公開コールによる次のエラーが表示されます。返されたエラーは、必須の Order_Id 項目を指定せずにイベントを公開したことによる同期エラーです。
VARIABLE_ASSIGNMENT [13]|err|"Error [statusCode=REQUIRED_FIELD_MISSING, code=[xmlrpc=1204, statusCode=REQUIRED_FIELD_MISSING, exceptionCode=null, scope=PublicApi, http=400], message=You must enter a value: Order_Id__c, fields=[Order_Id__c]]"|0x51be877a
Apex 公開コールバックで非同期エラーを捕捉する
Vijay は同期エラーを取得できました。ですが、内部システムエラーが原因でまれに発生する非同期の公開エラーは、公開コールの結果では返されません。Cloud Kicks は、高品質なカスタマーサービスを維持し、どの注文イベントの処理も見逃したくないと考えています。そのため、非同期のイベント公開エラーを捕捉して把握したいと考えています。このケースでは Apex 公開コールバックを使用できます。
Apex 公開コールバックを使用しない場合、EventBus.publish コールの Database.SaveResult が返すのは最終結果ではなく、中間のキュー追加結果だけです。コールバックを使用すると、最終結果を追跡できます。次のように、EventBus.EventPublishFailureCallback インターフェースの onFailure メソッドを実装することで、非同期の失敗を追跡できます。
public class FailureCallback implements EventBus.EventPublishFailureCallback {
public void onFailure(EventBus.FailureResult result) {
// Your implementation
// Get event UUIDs from the result
List<String> eventUuids = result.getEventUuids();
// ...
}
}非同期の公開操作が失敗すると、onFailure メソッドが呼び出されます。実装した onFailure メソッドでは、公開操作の最終結果に応じて処理するロジックを記述できます。onFailure メソッドは、公開操作の結果を含むパラメーター EventBus.FailureResult result を受け取ります。このパラメーターには失敗した各イベントの EventUuid 項目値が含まれますが、イベントのデータ自体は含まれません。getEventUuids メソッドを使用して、イベントの汎用一意識別子 (UUID) を取得します。各イベント UUID は、イベントメッセージを識別する UUID です。
onSuccess メソッドを実装して、EventBus.publish の成功結果を追跡することもできます。このモジュールでは onSuccess メソッドについては説明しません。通常はほとんどの公開コールが成功するためです。onSuccess メソッドについては開発者ガイドで詳しく学習できます。
Apex 公開コールバックの概要を理解できたところで、次の単元では Apex 公開コールバッククラスを記述して活用する方法を学習します。
リソース
