Web APIのリトライ処理実装

Pocket

Web系のAPIをたたいていると、たまにエラーが発生することがあります。要因はサーバー側がたまたまおかしかったり、proxyだったりと様々です。

エラー時にはリトライしつつAPIをたたく方法はいろいろ考えられますが、C#でのスマートな実例がStackOverflowで紹介されていました。リトライ専用のクラスとstaticメソッドを実装して、呼出にはデリゲート、ラムダ式を用いるという手法です。

Rubyでも同様の処理を行うコードを考えてみました。

class Retry
  @count = 10
  @wait = 60
  def self.do(func)
    ret = nil
    ex = nil
    for i in 1..@count do
      begin
        ret = func.call
        sleep(1)
        return ret
      rescue => e
        ret = nil
        ex = e
        sleep(@wait)
      end
    end
    if (!ex.nil?)
      ex = Exception.new
    end
    throw ex
  end
end

By knok

I am a Debian Developer and a board member of Free Software Initiative (FSIJ).