EventBus.RetryableException によるイベントトリガーの再試行
一次的な条件の例: マスターレコードの 1 つの項目が特定の値に等しい場合にトリガーで関連レコードをマスターレコードに追加するとします。後続の試行で項目値が変化し、トリガーで操作を実行できる可能性があります。
イベントトリガーを再試行するには、EventBus.RetryableException を発生させます。短い遅延の後、イベントが再送信されます。遅延は後続の再試行で大きくなります。トリガーでイベントのバッチを受信した場合、トリガーの再試行により、バッチ内のすべてのイベントが再送信されます。イベントは、変化しない ReplayID 項目値に基づいて、最初の順番で再送信されます。トリガーにより、再送信されるイベントと以降のバッチが順次処理されます。再送信されるイベントには、元のイベントと同じ項目値が含まれますが、イベントのバッチサイズは異なる可能性があります。たとえば、再実行 ID 10 ~ 20 のイベントを最初のトリガーで受信したとします。再送信されるバッチには、再実行 ID 10 ~ 40 のイベントが含まれ、大きくなる可能性があります。トリガーが再試行されると、再試行前のトリガーで実行された DML 操作はロールバックされ、変更は保存されません。
再試行回数の制限
トリガーを再試行する場合、トリガーは最大 10 回実行できます (最初の実行と 9 回の再試行)。9 回再試行された後、トリガーはエラー状態に移行し、新しいイベントの処理を停止します。トリガーがエラー状態に移行してから実行状態に戻るまでに送信されたイベントはトリガーに再送信されません。イベントの処理を再開するには、トリガーを修正して保存します。
再試行回数を 9 回未満に制限することをお勧めします。トリガーが再試行された回数を確認するには、EventBus.TriggerContext.currentContext().retries プロパティを使用します。または、API バージョン 43.0 以降では、EventBusSubscriber.retries 項目を照会できます。
例
次の例は、EventBus.RetryableException を発生させる方法と再試行回数を制限する方法をわかりやすくするための骨格のみのトリガーを示しています。このトリガーは if ステートメントを使用して、特定の条件が true かどうかを確認します。または、try-catch ブロックを使用して、catch ブロックで EventBus.RetryableException を発生させることもできます。