この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

公開と登録に関する一般的な考慮事項

公開と登録は別のプロセスであるため、この分離によって発生する可能性があるいくつかのシナリオを知っておく必要があります。

同じトランザクション内では実行されない公開者プロセスと登録者プロセス

イベント公開プロセスと登録プロセスは同じトランザクション内で実行されません。その結果、イベント公開者が公開後に作成した Salesforce レコードは、登録者がイベントメッセージを受信するまでにデータベースにコミットされない場合があります。登録者がそのレコードを検索すると、まだコミットされていないため見つからない可能性があります。たとえば、次のシナリオを考えてみましょう。

  1. あるプロセスビルダープロセスがイベントを公開し、ToDo レコードを作成します。
  2. ToDo オブジェクトのトリガが何らかのロジックを実行し、それにより ToDo レコードのコミットが遅延します。
  3. イベントに登録している別のプロセスビルダープロセスは、イベントを受信し、新しく作成された ToDo を検索します。トリガの実行が完了しておらず、レコードがまだコミットされていないため、このプロセスは次のエラーを返します。

    MyProcess process is configured to start when a MyEvent platform event message occurs. A MyEvent message occurred, but the process didn't start because no records in your org match the values specified in the process's Object node. (MyProcess プロセスは、MyEvent プラットフォームイベントメッセージが発生したときに開始するように設定されています。MyEvent メッセージが発生しましたが、組織のレコードがプロセスのオブジェクトノードで指定された値と一致しないため、プロセスは開始されませんでした。)

例ではプロセスビルダーを使用していますが、このシナリオは、API やトリガなど、他の公開および登録方法にも適用されます。

反対に、登録者がイベントメッセージ受信後に Salesforce レコードを作成した場合、新しいレコードは公開後すぐには見つからない可能性があります。その理由として、イベントが公開後に同期して処理されなかったか、ロジックが複雑なためにイベント処理に時間がかかったことが挙げられます。

イベント公開とトリガの実行順序

Salesforce オブジェクトの after insert トリガによってイベントが公開された場合、そのイベントは、トリガの Salesforce レコードがデータベースにコミットされる前に処理される可能性があります。たとえば、次のシナリオを考えてみましょう。

  1. カスタムオブジェクトの after insert トリガがイベントメッセージを公開します。
  2. あるプロセスビルダープロセスはイベントに登録しています。トリガの実行順序により、このプロセスは、トリガが実行を完了する前およびトリガが新しいカスタムオブジェクトレコードをコミットする前に起動されます。
  3. トリガはイベントに一致するレコードを検索しようとすると、レコードが見つからないため失敗します。

考えられる解決策の 1 つは、カスタムオブジェクトの作成日の直後にプラットフォームイベントを公開するスケジュール済みアクションをプロセスで作成することです。このスケジュール済みアクションは、カスタムオブジェクトがコミットされたら実行されます。もう 1 つの選択肢は、@queueable または @future Apex メソッドからイベントを公開することです。これにより、公開コールは、元のトランザクションがコミットされたときにのみ実行されます。トリガのトランザクションがロールバックされた場合、@queueable および @future メソッドは実行されず、イベントは公開されません。