retry-handler

「失敗したら N 回リトライする」という処理を簡単に書けるようにする Ruby ライブラリです。Procretry メソッドを生やして、リトライしたい処理をブロックで包むだけで最大回数・待ち時間・対象例外を指定したリトライができます。

gem として公開していて、Ruby 1.8/1.9 で動きます。

gem install retry-handler

使い方

Proc のブロック内で例外が発生すると、指定回数まで自動でリトライします。

Proc.new{
  # なんかエラーの起こるコード
}.retry(:max => 3, :accept_exception => StandardError)

:wait を指定すると失敗のたびに指定秒だけ待ってから次の試行に入ります。処理の流れを可視化したいときは :logger を付けます。Proc.new と書くのがダサいときは lambda でも使えます。

lambda{}.retry(:max => 3, :wait => 3)
lambda{}.retry(:max => 3, :wait => 3, :logger => Logger.new(STDERR))

Method オブジェクトにも retry が生えるので、既存メソッドをそのままリトライ対応にできます。File.read の例です。

File.method(:read).retry("./not_found.txt",
  :accept_exception => StandardError, :logger => Logger.new(STDERR))

内部設計

実体は 1 ファイル(lib/retry-handler.rb)で、中核は RetryHandler.retry_handler の 1 メソッドです。Proc#retryMethod#retryKernel#retry_handler はどれもそこへ委譲するモンキーパッチになっています。

retry-handler の呼び出し構造図

リトライループ本体(RetryHandler._retry_handler)の流れです。begin/rescue/retry の素直な作りで、失敗のたびにカウントを進めて sleep してやり直します。

retry-handler のリトライループのフロー図

自作の vrowser がこの gem を使っていて、マスターサーバーからのサーバー一覧取得が失敗したときのリトライに充てています。