Führt einen Codeblock aus und setzt ihn erneut ab, wenn eine Ausnahme auftritt. Es ist großartig, wenn Sie mit Flakey Webservices (zum Beispiel) arbeiten.
Es ist mit mehreren optionalen Parametern konfiguriert :tries :on , :sleep :matching :ensure ,: :exception_cb ,: :not ,: :sleep_method und führt den übergebenen Block aus. Sollte eine Ausnahme auftreten, wird sie für (n-1) Mal wiederholen.
Sollte die Anzahl der Wiederholungen ohne Erfolg erreicht werden, wird die letzte Ausnahme erhöht.
Installieren Sie das Edelstein:
$ gem installieren nachzusken
Fügen Sie es zu Ihrer GemFile hinzu:
Juwel 'wiederverzeigt' '
Öffnen Sie eine URL und geben Sie bis zu zweimal wieder, wenn ein OpenURI::HTTPError auftritt.
erfordern "Open-URI" -Treißableer.
xml = open ("http://example.com/test.xml") .ReadendVersuchen Sie den Block für immer.
# Für Ruby -Versionen vor 1.9.2 Verwendung: unendliches Symbol stattdessen # Code hier
Tun Sie etwas, machen Sie bis zu viermal nach, entweder für ArgumentError oder für Timeout::Error Fehlerausnahmen.
Wiederholbar. # Code hier
Stellen Sie sicher, dass der Codeblock ausgeführt wird, unabhängig davon, ob eine Ausnahme erhöht wurde. Es spielt keine Rolle, ob der Block normal nachlässt, wenn er den Codeblock ausführt oder ob er durch eine ungewöhnliche Ausnahme beendet wird: Der :ensure der Block ausgeführt wird.
f = File.open ("TestFile") sorgen Sie sicher_cb = proc do | Retries | setzt "Total -Wiederholungsversuche: #{Retries}"
F.CLOSEENDRETRYABLE.RETRYABLE (sicherstellen: sicher: sicherstellen)
# Process FileEndcontexts: {},
ensure: proc { },
exception_cb: proc { },
log_method: proc { },
matching: /.*/,
not: [],
on: StandardError,
sleep: 1,
sleep_method: lambda { |n| Kernel.sleep(n) },
tries: 2Wiederholbar kann auch global konfiguriert werden, um diese Standardeinstellungen zu ändern:
Wiederholbar.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 = 2endStandardmäßig wartet wiederum eine Sekunde zwischen den Wiederholungen. Sie können dies ändern und sogar Ihr eigenes exponentielles Backoff -Schema bereitstellen.
Wiederholbar. {} # Sleep 1, 4, 16 usw. Jeder VersuchSie können auch basierend auf der Ausnahmenachricht wiederholen:
Wiederholbar.Retyable (Matching: /io Timeout /) do | REMINGS, AUSBILD | Erhöhen Sie "oops io Timeout!" Wenn returns == 0end#Matching Param unterstützt auch das Array -Format: Wiederholbar.Retyable (Matching: [/io timeout/, "io tymeout"]) tun | Retries, Ausnahme | Erhöhen Sie "oops io Timeout!" Wenn return == 0end
Ihr Block wird mit zwei optionalen Parametern aufgerufen: bis jetzt die Anzahl der Versuche und die neueste Ausnahme.
Wiederholbar.Retyable do | Wiederholungen, Ausnahme | setzt "try #{retries} fehlgeschlagen mit Ausnahme: #{exception}", wenn retries> 0
# Code hier AUCECT_CB = Proc do | Ausnahme | # http://smartinez87.github.io/exception_notification
ExceptionNotifier.notify_exception (Ausnahme, Daten: {message: "Es fehlgeschlagen"}) endRetryable.retryable (exception_cb: exception_cb) tun
# Code hier # oder extrahieren Sie es stattdessen an globale Konfiguration: log_method = lambda do | Retries, Ausnahme | Logger.new (stdout) .debug ("[Versuch ## {retries}] erneut, weil [ #{exception.class} - #{exception.message}]: #{exception.backtrace.first (5) .Join (' |. Erhöhen Sie "oops io Timeout!" If Retries == 0End #D, [2018-09-01T18: 19: 06.093811 #22535] Debug-: [Versuch #1] Wiederholung, weil [RuntimeError-oops io Timeout!]: (IRB #1): 6: in "Block in irb_binding" | /home/nikita/projects/retryable/lib/retryable.rb:73:in `Wiederholbar '| (IRB#1): 6: In `irb_binding '| /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:in `eval '| /home/nikita/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/workspace.rb:85:in "Evaluieren"Wenn Sie es vorziehen, den nativen Logger von Rails zu verwenden:
log_method = lambda do | returns, Ausnahme | Rails.logger.debug ("[Versuch ## {Retries}] Wiederholung, weil [ #{exception.class} - #{exception.message}]: #{exception.backtrace.first (5) .Join ('|') }")Ende Kontexte ermöglichen es Ihnen, gemeinsame Retryable.retryable zu extrahieren.
Wiederholbar.Configure do | config | config.contexts [: fehlerhöhle] = {on: [fehlerservicetimeouterror], Schlaf: 10, Versuche: 5
} endRetryable.with_context (: fehlerhaft_service) {
# Code hier}Sie können auch Optionen überschreiben, die in Ihren Kontexten definiert sind:
#: On & Sleep im Kontext früher sind immer noch effektiv.with_context (: fehlerhaft_service, Versuche: 999) {{
# Code hier}Wiederholbar.Enabled? => Trueretryable.DisablEryable.Enabled? => False
Es werden keine Versuche mehr gemacht, wenn eine Ausnahme aufgeführt ist, die in :not erhöht wird. Nimmt Vorrang vor :on .
Klasse MyError <StandardError; endretyable.retyable (Versuche: 5, ON: [StandardError], nicht: [MyError]) tun Erhöhen Sie MyError "No Retries!"
:sleep_method anDies kann sehr nützlich sein, wenn Sie mit Celluloid arbeiten, das eine eigene Version des Methode Sleep implementiert.
Wiederholbar # Code hier
Diese Bibliothek soll die folgenden Ruby -Versionen unterstützen und wird getestet:
Ruby 3.3
Ruby 3.2
Ruby 3.1
Ruby 3.0
Ruby 2.7
Ruby 2.6
Ruby 2.5
Ruby 2.4
Ruby 2.3
Ruby 2.2
Ruby 2.1
Ruby 2.0
HINWEIS: Wenn Sie retryable auf Ruby 1.8 ausgeführt werden müssen, verwenden Sie GEM -Versionen vor der Version 3.0.0
Wenn etwas auf einer dieser Versionen nicht funktioniert, ist es ein Fehler.
Diese Bibliothek kann versehentlich auf andere Ruby -Versionen funktionieren (oder anscheinend funktionieren), aber für die oben aufgeführten Versionen wird jedoch nur Unterstützung bereitgestellt.
Wenn Sie möchten, dass diese Bibliothek eine andere Ruby -Version oder -implementierung unterstützt, können Sie sich freiwillig als Betreuerin freiwillig melden.