コードブロックを実行し、例外が発生したときにそれを取得します。 Flakey Webサービス(たとえば)を使用するときは素晴らしいことです。
いくつかのオプションのパラメーターを使用して構成されています:tries 、 :on 、 :sleep 、 :matching 、 :ensure 、 :exception_cb 、 :not 、 :sleep_methodを使用して、通過したブロックを実行します。例外が発生した場合、(n-1)時間は再試行します。
成功せずにレトリの数に達した場合、最後の例外が提起されます。
宝石をインストールします:
$ gemインストールretryable
Gemfileに追加してください:
gem 'retryable'
URLを開き、 OpenURI::HTTPErrorが発生したときに最大2回再試行します。
「open-uri」retryable.retryable(tries:3、on:openuri :: httperror)が必要です xml = open( "http://example.com/test.xml").readend
ブロックを永遠に試してください。
#1.9.2の前のルビーバージョンの場合:Infinite Symbol assonderable.retryable(tries:float :: infinity)do #ここでコード
何かをして、 ArgumentErrorまたはTimeout::Error例外のいずれかで最大4回再試行します。
retryable.retryable(tries:5、on:[argableerror、timeout :: error])do #ここでコード
例外が提起されたかどうかに関係なく、コードのブロックが実行されることを確認してください。ブロックが正常に終了するかどうか、コードのブロックを実行するために取得した場合、または無作法:ensure例外によって終了した場合は関係ありません。
f = file.open( "testfile")surese_cb = proc do | retries | 「総再試行試行:#{retries}」を置く
F.CloseEndRetryable.retryable(sures:surse_cb)do
#プロセスファイルエンドcontexts: {},
ensure: proc { },
exception_cb: proc { },
log_method: proc { },
matching: /.*/,
not: [],
on: StandardError,
sleep: 1,
sleep_method: lambda { |n| Kernel.sleep(n) },
tries: 2再生可能なデフォルトを変更するようにグローバルに構成することもできます。
retryable.configure do | config | config.contexts = {}
config.ensure = proc {}
config.exception_cb = proc {}
config.log_method = proc {}
config.matching = /.*/
config.not = []
config.on = StandardError
config.sleep = 1
config.sleep_method = lambda {| n | kernel.sleep(n)}
config.tries = 2endデフォルトでは、再試行の間に再生可能が1秒間待機します。これを変更し、独自の指数関数的なバックオフスキームを提供することもできます。
retryable.retryable(sleep:0){}#retriesretryable.retryable(sleep:10){}#retriesretryable.retryable(sleep:lamda {| n | 4 ** n})の間に10秒間スリープ間で一時停止しないでください。 {}#スリープ1、4、16など。例外メッセージに基づいて再試行することもできます。
retryable.retryable(一致: /ioタイムアウト /)do | retries、例外| 「oops io timeout!」を上げます。 retries == 0END#一致している場合、パラメーションサポートアレイ形式:retryable.retryable(一致:[/ioタイムアウト/、 "io tymeout"])do | retries、例外| 「oops io Timeout!」を上げます。 retries == 0ENDの場合
ブロックは、2つのオプションのパラメーターで呼び出されます。これまでの試行回数と、最新の例外です。
retryable.retryable do | retries、例外| puts "try#{retries}が例外をもって失敗しました:#{例外}" retries> 0
#ここでコードException_cb = proc do |例外| #http://smartinez87.github.io/exception_notification
exceptionNotifier.notify_exception(例外、データ:{message: "failed"})endretryable.retryable(excest_cb:Exception_cb)do
#ここでコード#またはそれを代わりにグローバル構成に抽出します:log_method = lambda do | retries、例外| logger.new(stdout).debug( "[tired ## {retries}]再試行|。 ')} ")endretryable.retryable(log_method、matching: /io timeout /)do | retries、例外| 「oops io timeout!」を上げます。 retiries == 0END#D、[2018-09-01T18:19:06.093811#22535]デバッグ - :[RuntimeError-OOPS IO TimeOut!] :( IRB#1):6:6:in `IRB_Bindingのブロック '| /home/nikita/projects/retryable/lib/retryable.rb:73:in `retryable '| (IRB#1):6:「IRB_Binding」| /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:85:85:85:85:85: /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:in `Evaluate 'Railsのネイティブロガーを使用したい場合:
log_method = lambda do | retries、例外| rails.logger.debug( "[tired ## {retries}]再試行}")終わりコンテキストを使用すると、再利用または読みやすさのために共通のRetryable.retryable通話オプションを抽出できます。
retryable.configure do | config | config.contexts [:faulty_service] = {on:[faultyservicetimeouterror]、sleep:10、tries:5
} endretryable.with_context(:faulty_service){
#ここにコード}また、コンテキストで定義されているオプションをオーバーライドすることもできます。
#:以前のコンテキストで定義されているon&sleepは、まだ効果的です。 #ここにコード}
retryable.enabled?=> trueretryable.disableretrytable.enabled?=> false
例外がリストされている場合:notこれ以上試行は行われません。優先順位を取る:on 。
クラスmyerror <starndererror; endretryable.retryable(tries:5、on:[StandardError]、not:[myerror])do MyErrorを上げます
:sleep_methodを指定しますこれは、メソッドスリープの独自のバージョンを実装するセルロイドを使用している場合に非常に便利です。
retryable.retryable(sleep_method:celluloid.method(:sleep))do #ここでコード
このライブラリは、サポートすることを目的としており、次のRubyバージョンに対してテストされています。
Ruby 3.3
ルビー3.2
Ruby 3.1
Ruby 3.0
Ruby 2.7
ルビー2.6
ルビー2.5
ルビー2.4
Ruby 2.3
ルビー2.2
Ruby 2.1
Ruby 2.0
注:3.0.0リリース前にRuby 1.8で実行retryable場合は、Ruby 1.8でGEMバージョンを使用する必要がある場合
これらのバージョンのいずれかで何かが機能しない場合、それはバグです。
このライブラリは、他のRubyバージョンで不注意に機能する(または機能しているように見える)場合がありますが、上記のバージョンでのみサポートが提供されます。
このライブラリに別のRubyバージョンまたは実装をサポートしたい場合は、メンテナーになるためにボランティアをすることができます。