Skip to main content
Register now for TDX! Join the must-attend event to experience what’s next and learn how to build it.

Apex でのプラットフォームイベントの公開に関するトラブルシューティング

学習の目的

この単元を完了すると、次のことができるようになります。

  • 公開コールから取得できる 2 種類の結果について説明する。
  • 公開コールから返される同期エラーを取得する。
  • エラーをデバッグログに記録し、デバッグログでエラーを確認する。
  • Apex 公開コールバックとは何かを説明する。

始める前に

このモジュールには、高度な Apex プログラミングスキルが必要です。始める前に、Apex とプラットフォームイベントについて確実に理解しておいてください。これらの学習には以下のリソースが役立ちます。

Cloud Kicks - プラットフォームイベントを使用して注文を処理

Cloud Kicks は、スニーカーのカスタマイズ注文に対応している小売業者です。Cloud Kicks で開発を担当する Vijay Lahiri は、スニーカーの注文を処理するアプリケーションの作成を任されています。Vijay は、お客様からの注文に対してプラットフォームイベントを公開します。(非同期エラーによってイベントの公開が失敗した場合の処理については、次の単元で説明します。)

注文処理の最初のステップは、受けた注文に対してプラットフォームイベントを公開することです。プラットフォームイベントを公開すると、サブスクライバーアプリケーションがイベントを受信し、注文を非同期で処理できるようになります。プラットフォームイベントをリスンして注文を処理すると、大量の注文にも対応しやすくなります。この単元では、プラットフォームイベントの公開が非同期であることと、公開コールから返される同期エラーと非同期結果をどのように区別するかを説明します。

Cloud Kicks は、スニーカーのカスタマイズ注文に対応している小売業者

公開の中間結果と最終結果

Apex では、 EventBus.publish メソッドを使用してプラットフォームイベントを公開します。イベントの公開は非同期に実行されます。イベントを公開すると、そのイベントは Salesforce でキューに追加され、システムリソースが使用可能になった時点で後から公開されます。公開コールの実行直後に返される結果は、そのイベントをキューに追加した中間結果です。公開コールに問題がある場合は、同期的に即時エラーが返されることがあります。たとえば、必須項目が欠けた状態でイベントを公開すると、エラーが返されます。公開コールを修正して、公開を再び試すことができます。

即時結果は、Database.SaveResult で返されます。Database.SaveResultisSuccess メソッドが true を返した場合、その公開要求は Salesforce でキューに追加され、イベントメッセージは非同期で公開されます。isSuccessfalse を返したら、イベント公開操作でエラーが発生し、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 コードスニペットを実行できます。

  1. 開発者コンソールを開くには、クイックアクセスメニュー () をクリックしてから、[Developer Console (開発者コンソール)] をクリックします。
  2. [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
  3. 新しいウィンドウで、既存の内容をすべてコードスニペットに置き換え、[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 メソッドについては開発者ガイドで詳しく学習できます。

Note

詳細情報

公開コールバックは Apex にのみ適用されます。Apex の利点は、Salesforce Platform で実行されるイベント公開コードを記述できることです。プラットフォームで公開する必要がない場合は、Pub/Sub API を使用してイベントを公開できます。Pub/Sub API では、イベント公開の結果が最終結果です。公開コールが成功した場合、そのイベントは公開済みとなり、イベントバスに格納されています。詳細は、Pub/Sub API ドキュメントの「Get Started with Pub/Sub API (Pub/Sub API の使用開始)」を参照してください。

Apex 公開コールバックの概要を理解できたところで、次の単元では Apex 公開コールバッククラスを記述して活用する方法を学習します。

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む