코드 블록을 실행하고 예외가 발생하면 검색됩니다. Flakey Webservices (예 :) 작업 할 때 좋습니다.
몇 가지 선택적 매개 변수를 사용하여 구성됩니다 :tries
, :on
, :sleep
, :matching
, :ensure
, :exception_cb
, :not
, :sleep_method
및 전달 된 블록을 실행합니다. 예외가 발생하면 (N-1) 시간 동안 다시 시도합니다.
성공없이 리트리 수에 도달하면 마지막 예외가 제기됩니다.
보석 설치 :
$ GEM 설치 가능
보석에 추가하십시오.
보석 '레트레이션 가능'
OpenURI::HTTPError
발생하면 URL을 열고 최대 두 번 다시 시도하십시오.
"Open-uri"를 필요로합니다. Retryable.resryable (Tries : 3, On : OpenUri :: Httperror) do XML = Open ( "http://example.com/test.xml")
블록을 영원히 시도하십시오.
# 1.9.2 이전의 Ruby 버전의 경우 사용 : Infinite Symbol 대신 retryable.resryable (tries : float :: infinity) do # Code HIEGEND
ArgumentError
또는 Timeout::Error
예외에 대해서도 최대 4 번 다시 시도하십시오.
Retryable.resryable (Tries : 5, ON : [ArgumentERROR, TimeOut :: ERROR]) DO # Code HIEGEND
예외가 제기되었는지 여부에 관계없이 코드 블록이 실행되는지 확인하십시오. 블록이 정상적으로 종료 되든 코드 블록을 실행하기 위해 재시험하거나, 끊임없는 예외에 의해 종료되는지 ( :ensure
.
f = file.open ( "testfile") ritt_cb = proc do | Restries | "총 재시험 시도 : #{retries}" f.closeendretryable.resryable (보장 : 보장) # 프로세스 파일 엔드
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 초 동안 기다립니다. 이를 변경하고 자체 지수 백 오프 체계를 제공 할 수도 있습니다.
Retriestrible.retryable.retryable (수면 : 10) 사이에서 전혀 일시 중지하지 마십시오. retriesretryable.retyable 사이에서 10 초 동안 수면 : Lambda {| n | 4 ** n}) {} # sleep 1, 4, 16 등. 각 시도
예외 메시지를 기반으로 다시 시도 할 수도 있습니다.
Retryable.resryable (일치 : /io timeout /) do | Restries, Exception | "Oops IO 타임 아웃!" RESTREIS == 0END#일치하는 PARAM은 배열 형식을 지원합니다 : RETRYABLE.RETRYABLE (일치 : [/io timeout/, "io tymeout"]) do | retries, Exception | "Oops IO 타임 아웃!" Retries == 0end
블록은 두 가지 선택적 매개 변수로 호출됩니다 : 지금까지 시도 횟수와 가장 최근의 예외.
재 시정 가능. 보충 가능한 do | 검색, 예외 | "try #{retries}를 예외로 실패한"try #{retries} "를 넣습니다. # Code HIEGEND
Exception_cb = Proc Do | 예외 | # http://smartinez87.github.io/exception_notification ExceptionNotifier.notify_Exception (예외, 데이터 : {메시지 : "It 실패") endReTryable.Resryable (Exception_CB : Exception_CB) DO # Code HIEGEND
# 또는 대신 글로벌 구성으로 추출하십시오 : log_method = lambda do | 리트리, 예외 | logger.new (stdout) .debug ( "[ #{exception.class} - #{exception.message}] : #{Exception.backtrace.first (5) .join ( '. | "Oops IO 타임 아웃!" if retries == 0end #d, [2018-09-01T18 : 19 : 06.093811 #22535] 디버그-: [runtimeerror-oops io timeout!] : (irb #1) : 6 : in. `irb_binding의 블록 '| /home/nikita/projects/retryable/lib/retryable.rb:73:in`retryable '| (IRB#1) : 6 : in`Irb_binding '| /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:in` 평가 '| /home/nikita/.rvm/rubies/ruby/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:in` 평가 ''
Rails의 네이티브 로거를 사용하고자하는 경우 :
log_method = lambda do | 검색, 예외 | Rails.logger.debug ( "[ #{exception.class} - #{exception.message}] : #{exception.backtrace.first (5) .join ( '|')이기 때문에 재 시도합니다. }")끝
컨텍스트를 사용하면 재사용 또는 가독성 목적을위한 Retryable.retryable
호출 옵션을 추출 할 수 있습니다.
Retryable.configure do | config | config.contexts [: faulty_service] = {on : [forultyservicetimeouterror], 수면 : 10, 트림 : 5 } endRetryable.with_context (: faulty_service) { # Code Here}
컨텍스트에서 정의 된 옵션을 무시할 수도 있습니다.
# : 컨텍스트에서 정의 된 on & sleep. # Code Here}
retryable.enabled? => trueretryable.disaberetryable.enabled? => false
예외가 :not
경우 더 이상 시도되지 않습니다. 우선 순위 :on
.
클래스 MyError <표준 메러; endRetryable.RETRYBLE (TRIES : 5, ON : [StandardERROR], NOT : [MYERROR]) DO MyError를 "재 회복 없음!"끝을 올리십시오
:sleep_method
를 지정하십시오이것은 자체 버전의 방법 수면을 구현하는 셀룰로이드로 작업 할 때 매우 유용 할 수 있습니다.
Retryable.resryable (sleep_method : celluloid.method (: sleep)) do # Code HIEGEND
이 라이브러리는 지원을 목표로하며 다음 루비 버전에 대해 테스트됩니다.
루비 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 버전을 사용하십시오.
이 버전 중 하나에서 무언가가 작동하지 않으면 버그입니다.
이 라이브러리는 다른 루비 버전에서 실수로 작동하거나 작동하는 것처럼 보이지만 위에 나열된 버전에 대해서만 지원됩니다.
이 라이브러리가 다른 루비 버전이나 구현을 지원하기를 원한다면 자원 봉사자가 될 수 있습니다.