運行一個代碼塊,並在發生異常時重試。使用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版本或實現,則可以自願成為維護者。