ActiveJobの `retry_on` が Float の `:wait` を受け付けるようになった

rails/rails

ActiveJob の retry_on:wait オプションに Float 値を渡すことを正式にサポートし、整数への変換ではなくそのままの小数点以下を利用できるようになりました。これにより、1.5.seconds のようなサブ秒レベルの待ち時間指定が例外なく動作し、テストでも期待通りのリトライ間隔が確認できます。

背景

retry_on:wait は従来「秒数(デフォルト 3 秒)」と記載され、整数のみが正しく処理されていました。Float を渡すと determine_delay がマッチせず Couldn't determine a delay based on 2.5 という例外が発生し、リトライ自体が行われない問題がありました(例: retry_on SomeError, wait: 2.5)。この挙動は ActiveJob.set(wait: 2.5) が Float を受け入れるのとは不整合で、開発者に混乱を招いていました。PR #57817 ではこの不整合を解消し、Float を正式に受け入れる変更が行われました。

技術的な変更

activejob/lib/active_job/exceptions.rbdetermine_delay メソッドに Float をマッチ対象に加え、遅延計算に to_f を使用するよう変更されました。

変更前:

when ActiveSupport::Duration, Integer, Float
  delay = seconds_or_duration_or_algorithm.to_i

変更後:

when ActiveSupport::Duration, Integer, Float
  delay = seconds_or_duration_or_algorithm.to_f

この差分により、2.54.5 といった Float がそのまま秒数として扱われ、内部で整数へ丸める処理が除かれました。さらに、activejob/test/jobs/retry_job.rb では FloatWaitError の待機時間を wait: 4.5 に変更し、テストコードでも期待遅延 4.5.seconds が正しく計算されることを検証しています。テストケース float wait job も同様に期待値を 4.5.seconds に合わせて更新され、 CI がパスすることが確認されています。

設計判断

Float の受け入れは Numeric 系の拡張として最小限の変更で実装され、既存の整数・Duration との互換性を保持しています。to_f を用いることで、将来的にサブ秒精度をサポートできる余地を残しつつ、現行のキューアダプタが整数秒のみを期待するケースでも安全に動作します。新たな設定キーを導入せず、既存の retry_on オプションをそのまま拡張した点が、バックワード・コンパチビリティを重視した設計判断と言えるでしょう。

まとめ

retry_on:wait に Float を渡すことが正式に可能になり、ActiveJob.set と同様の挙動が提供されました。determine_delay のマッチ対象拡張と to_f への変更だけで実装でき、既存コードへの影響はほぼありません。この改修により、サブ秒レベルのリトライ遅延指定が安全に利用できるようになりました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
efc19ad7

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的変更、設計判断、まとめが明確に配置されており、総論→各論→結論の構成が守られています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きハイライトは正しい形式ですが、PRリンクの記法が「[PR #57817](URL)」となっており、要件の「[#57817](URL)」と異なります。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門的なエンジニア向けの記述であり、余計な初学者向け説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論の段落構成になっており、トピックセンテンスで始まり、1段落1トピック・適切な長さが保たれています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックはDiffの変更箇所と一致しており、抜粋・省略があっても内容の理解を阻害していません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語はPRおよびRailsコードベースと一致しており、誤用は見られません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

Float をそのまま利用する変更点とその影響が正確に説明されており、根拠がDiffとPRに裏付けられています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の全ての主張はPR情報やDiffに基づいており、推測や外部知識の追加はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号、Float 値 (2.5, 4.5) などの数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRタイトルの内容を正しく要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事はPR以外の外部情報を含んでいません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現に関する記載はなく、PRと矛盾する表現もありません。