インストール
$ gem install retriable
実装例
require 'retriable' class SampleError < RuntimeError end puts <<~EOS | exception | try | elapsed_time | time | |-----------------|-----|--------------|--------------| EOS Retriable.configure do |c| c.tries = 5 c.base_interval = 1 c.rand_factor = 0 c.on = SampleError c.on_retry = -> (exception, try, elapsed_time, next_interval) { puts format('| %-15s | %3d | %12f | %-12s |', exception, try, elapsed_time, Time.now.strftime('%H:%M:%S.%L')) } end begin Retriable.retriable do |try| raise SampleError if try < 5 end puts format('| %-15s | --- | ------------ | %-12s |', 'done', Time.now.strftime('%H:%M:%S.%L')) rescue SampleError => e puts format('| %-15s | --- | ------------ | %-12s |', e, Time.now.strftime('%H:%M:%S.%L')) end
実行。
$ ruby samle.rb | exception | try | elapsed_time | time | |-----------------|-----|--------------|--------------| | SampleError | 1 | 0.000040 | 13:29:53.806 | | SampleError | 2 | 1.005182 | 13:29:54.811 | | SampleError | 3 | 2.508871 | 13:29:56.315 | | SampleError | 4 | 4.764138 | 13:29:58.570 | | done | --- | ------------ | 13:30:01.948 |
リトライ回数を 3 回にしてみます。
# 略 Retriable.configure do |c| c.tries = 3 # 略 end # 略
実行。
$ ruby sample.rb | exception | try | elapsed_time | time | |-----------------|-----|--------------|--------------| | SampleError | 1 | 0.000041 | 13:35:22.001 | | SampleError | 2 | 1.000827 | 13:35:23.002 | | SampleError | 3 | 2.501092 | 13:35:24.502 | | SampleError | --- | ------------ | 13:35:24.502 |