EventBus.RetryableException によるイベントトリガの再試行
一次的な条件の例: マスタレコードの 1 つの項目が特定の値に等しい場合にトリガで関連レコードをマスタレコードに追加するとします。後続の試行で項目値が変化し、トリガで操作を実行できる可能性があります。
イベントトリガを再試行するには、EventBus.RetryableException を発生させます。短い遅延の後、イベントが再送信されます。遅延は後続の再試行で大きくなります。トリガでイベントのバッチを受信した場合、トリガの再試行により、バッチ内のすべてのイベントが再送信されます。再送信されるイベントには、元のイベントと同じ項目値が含まれますが、イベントのバッチサイズは異なる可能性があります。たとえば、再生 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 を発生させることもできます。
1trigger ResendEventsTrigger on Low_Ink__e (after insert) {
2 if (condition == true) {
3 // Process platform events.
4 } else {
5 // Ensure we don't retry the trigger more than 4 times
6 if (EventBus.TriggerContext.currentContext().retries < 4) {
7 // Condition isn't met, so try again later.
8 throw new EventBus.RetryableException(
9 'Condition is not met, so retrying the trigger again.');
10 } else {
11 // Trigger was retried enough times so give up and
12 // resort to alternative action.
13 // For example, send email to user.
14 }
15 }
16}