运行一个代码块,并在发生异常时重试。使用Flakey Web服务(例如),这很棒。
它是使用多个可选参数配置的:tries , :on :on :sleep :matching , :ensure , :exception_cb , :not , :sleep_method并运行传递的块。如果发生例外,它将重试(n-1)次。
如果在没有成功的情况下达到检索的数量,将提高最后一个例外。
安装宝石:
$ gem安装可重试
将其添加到您的gemfile中:
宝石“可重试”
打开一个URL,在发生OpenURI::HTTPError时最多重试两次。
需要“ open-uri”可重击。 xml = open(“ http://example.com/test.xml”).readend
永远尝试块。
#对于1.9.2之前的红宝石版本,请使用:无限符号而不是逆转。 #代码此处
做某事,最多四次,以ArgumentError或Timeout::Error异常。
可撤离。可取回(尝试:5,on:[grighterror,timeout :: error]) #代码此处
确保执行代码块,无论是否提出例外。块是否正常退出,是否重试执行代码块,或者是由未熟悉的异常终止的 - :ensure块将运行。
f = file.open(“ testfile”) 将“总重试尝试:#{retry}”
F.CloseEndRetry.able.tryable(确保:suse_cb)做
#流程文件条件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 = 2 end默认情况下,可退缩等待一秒钟的回程。您可以更改此操作,甚至可以提供自己的指数向后方案。
重试。 {}#睡1、4、16等。每个尝试您也可以根据例外消息进行重试:
retryable.tryable(匹配: /io timeout /)做|重试,例外| 举起“哎呀,超时!”如果retries == 0 end#匹配参数也支持数组格式:retryable.bryable(匹配:[/io timeout/,“ io tymeout”])do | retries,例外| 举起“哎呀,超时!”如果reties == 0 end
您的块被两个可选参数调用:到目前为止的尝试数和最新例外。
可取回。可退缩|重试,例外| puts“尝试#{retries}失败,异常:#{exception}”
#代码此处exception_cb = proc do |异常| #http://smartinez87.github.io/exception_notification
exceptionnotifier.notify_exception(异常,数据:{消息:“失败”})endRetryable.tryable.tryable(exception_cb:exception_cb)do
#代码此处#或将其提取到Global Config而不是:log_method = lambda do | retry,异常| logger.new(stdout).debug(“ [[尝试## {retries}]重试,因为[#{#{exception.class} - #{exception.message}]:#{exception.backtrace.first(5).join('join('' |。 举起“哎呀,超时!”如果retries == 0end#d,[2018-09-01T18:19:06.093811#22535] debug - :[尝试#1]因为[runtimeerror-oops io timeout!] :( irb#1):(irb#1):6: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:在``eval'| /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:在`如果您喜欢使用Rails的本机记录仪:
log_method = lambda do |重试,例外| rails.logger.debug(“ [[尝试## {retry}]重试,因为[#{exception.class} - #{exception.message}]:#{exception.backtrace.first(5).join('|'|') }“)结尾上下文允许您提取常见的Retryable.retryable 。可重复使用或可读性目的的可退回呼叫选项。
retryable.configure do | config | config.contexts [:fressy_service] = {on:[fallserservicemetimentoutror],睡眠:10,尝试:5
} endRetryable.with_context(:fressy_service){
#在这里代码}您也可以覆盖上下文中定义的选项:
#:在前面上下文中定义的ON&睡眠仍然是效应virestry.with_context(:fressy_service,tries:999){
#在这里代码}retryable.enabled?=> trueRetryable.disableRetryable.enabled?=> false
如果列出的例外:not提出:不再进行尝试。优先:on 。
类MyError <标准Error;终端可取回(尝试:5,on:[standarderror],而不是:[myError] DO) 提高米索尔“没有重试!”结局
:sleep_method当您使用赛璐oid(可以实现自己的方法睡眠版本)时,这可能非常有用。
可撤离。可取代(sleep_method:赛luloid.method(:sleep)) #代码此处
该图书馆旨在支持并根据以下红宝石版本进行测试:
红宝石3.3
红宝石3.2
红宝石3.1
红宝石3.0
红宝石2.7
红宝石2.6
红宝石2.5
红宝石2.4
红宝石2.3
红宝石2.2
红宝石2.1
红宝石2.0
注意:如果您需要在Ruby 1.8上retryable ,请在3.0.0发布之前使用GEM版本
如果某个版本中的某个版本不起作用,那是一个错误。
该库可能会在其他Ruby版本上无意间(或似乎似乎可以使用),但是只能为上面列出的版本提供支持。
如果您希望此库支持另一个Ruby版本或实现,则可以自愿成为维护者。