分離された公開と登録
パブリッシャーではトランザクション境界が考慮されない
イベントが [すぐに公開] の公開動作で定義されている場合、プラットフォームイベントメッセージの公開はトランザクション方式で行われません。その結果、イベント公開者が公開後に作成した Salesforce レコードは、登録者がイベントメッセージを受信するまでにデータベースにコミットされない場合があります。登録者がそのレコードを検索すると、まだコミットされていないため見つからない可能性があります。たとえば、次のシナリオを考えてみましょう。
- あるプロセスビルダープロセスがイベントを公開し、ToDo レコードを作成します。
- ToDo オブジェクトのトリガが何らかのロジックを実行し、それにより ToDo レコードのコミットが遅延します。
- イベントに登録している別のプロセスビルダープロセスは、イベントを受信し、新しく作成された 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 レコードを作成した場合、新しいレコードは公開後すぐには見つからない可能性があります。その理由として、イベントが公開後に同期して処理されなかったか、ロジックが複雑なためにイベント処理に時間がかかったことが挙げられます。
解決策
解決策として、イベントの公開動作を [コミット後に公開] に変更します。この動作では、イベントメッセージは最初のプロセスで ToDo レコードが作成され、トランザクションが完了した後で公開されます。2 番目のプロセスは ToDo レコードを検索できます。
トリガから公開されるイベント
[すぐに公開] の公開動作で定義されているイベントを公開する Salesforce オブジェクトの after insert トリガを考えます。このイベントは、トリガの Salesforce レコードがデータベースにコミットされる前に処理される可能性があります。たとえば、次のシナリオを考えてみましょう。
- カスタムオブジェクトの after insert トリガがイベントメッセージを公開します。
- あるプロセスビルダープロセスはイベントに登録しています。このプロセスは、トリガが実行を完了する前およびトリガが新しいカスタムオブジェクトレコードをコミットする前に起動されます。
- トリガはイベントに一致するレコードを検索しようとすると、レコードが見つからないため失敗します。
解決策
解決策として、イベントの公開動作を [コミット後に公開] に変更します。この動作では、イベントメッセージはトリガによってカスタムオブジェクトレコードが作成され、トランザクションがコミットした後で公開されます。公開されたイベントメッセージを受信した 2 番目のプロセスは、最初のプロセスが作成した新しいレコードを検索できます。