Menjalankan blok kode, dan mencoba lagi saat pengecualian terjadi. Sangat bagus saat bekerja dengan servis web flakey (misalnya).
Ini dikonfigurasi menggunakan beberapa parameter opsional :tries , :on , :sleep , :matching , :ensure , :exception_cb , :not , :sleep_method dan menjalankan blok yang dilewati. Jika pengecualian terjadi, itu akan mencoba lagi untuk (n-1) kali.
Jika jumlah retries dicapai tanpa hasil, pengecualian terakhir akan dinaikkan.
Instal Permata:
$ permata instalasi ulang
Tambahkan ke Gemfile Anda:
Permata 'Ditukang'
Buka URL, coba lagi hingga dua kali ketika OpenURI::HTTPError terjadi.
Membutuhkan "Open-Uri" Retryable.
xml = buka ("http://example.com/test.xml") .readendCoba blok selamanya.
# Untuk versi ruby sebelum 1.9.2 Gunakan: simbol tak terbatas sebagai gantinya dapat dikeluarkan (mencoba: float :: infinity) lakukan # Kode di sini
Lakukan sesuatu, coba lagi hingga empat kali untuk ArgumentError atau Timeout::Error Exceptions.
Retryable. # Kode di sini
Pastikan bahwa blok kode dieksekusi, terlepas dari apakah pengecualian dinaikkan. Tidak masalah jika blok keluar secara normal, jika ia berulang untuk menjalankan blok kode, atau jika diakhiri dengan pengecualian yang tidak dibutuhkan - blok :ensure blok akan dijalankan.
f = file.open ("testfile") paste_cb = proc do | retries | menempatkan "upaya coba lagi: #{retries}"
f.closeEndRetryable.Retryable (Pastikan: Pastikan_CB) lakukan
# Proses Fileendcontexts: {},
ensure: proc { },
exception_cb: proc { },
log_method: proc { },
matching: /.*/,
not: [],
on: StandardError,
sleep: 1,
sleep_method: lambda { |n| Kernel.sleep(n) },
tries: 2Dapat dikonsumsikan juga dapat dikonfigurasi secara global untuk mengubah default itu:
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 = 2endSecara default, tunggu yang dapat dikembalikan satu detik di antara retries. Anda dapat mengubah ini dan bahkan memberikan skema backoff eksponensial Anda sendiri.
Retryable. {} # tidur 1, 4, 16, dll. Masing -masing mencobaAnda juga dapat mencoba lagi berdasarkan pesan pengecualian:
Retryable. Naikkan "Ups IO Timeout!" Jika retries == 0End#pencocokan param mendukung format array juga: Retryable.Retryable (pencocokan: [/io timeout/, "io tymeout"]) do | retries, pengecualian | Naikkan "Ups IO Timeout!" jika retries == 0End
Blok Anda dipanggil dengan dua parameter opsional: jumlah percobaan sampai sekarang, dan pengecualian terbaru.
Retryable.Retryable do | Retries, Exception | menempatkan "coba #{retries} gagal dengan pengecualian: #{exception}" jika retries> 0
# Kode di sini Exception_cb = proc do | Exception | # http://smartinez87.github.io/exception_notification
ExceptionNotifier.Notify_Exception (Exception, data: {pesan: "itu gagal"}) endRetryable.Retryable (exception_cb: exception_cb)
# Kode di sini # atau ekstrak ke config global sebagai gantinya: log_method = lambda do | retries, exception | Logger.new (stdout) .debug ("[coba ## {retries}] coba lagi karena [ #{exception.class} - #{exception.message}]: #{exception.backtrace.first (5) .join (' |. Naikkan "Ups IO Timeout!" Jika retries == 0End #d, [2018-09-01T18: 19: 06.093811 #22535] DEBUG-: [Upaya #1] Mencoba lagi karena [RuntimeError-OOPS IO Timeout!]: (IRB #1): 6: In `Blok di IRB_BINGING '| /home/nikita/projects/retryable/lib/retryable.rb:73:in `Retryable '| (IRB#1): 6: Dalam `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 `evaluasi 'Jika Anda lebih suka menggunakan Logger Asli Rails:
log_method = lambda do | retries, pengecualian | Rails.logger.debug ("[coba ## {retries}] coba lagi karena [ #{exception.class} - #{exception.message}]: #{exception.backtrace.first (5) .join ('| }")akhir Konteks memungkinkan Anda untuk mengekstraksi Umum Retryable.retryable Opsi Panggilan yang Dapat Dicabut untuk tujuan penggunaan kembali atau keterbacaan.
Retryable.configure do | config | config.contexts [: fisty_service] = {on: [fistyServiceTimeouterror], tidur: 10, mencoba: 5
} endRetryable.with_context (: fisty_service) {
# kode di sini}Anda juga dapat mengganti opsi yang ditentukan dalam konteks Anda:
#: on & sleep yang didefinisikan dalam konteks sebelumnya masih berlaku. with_context (: fisty_service, mencoba: 999) {
# kode di sini}Retryable.enabled? => Trueretryable.disableretryable.enabled? => False
Tidak ada lagi percobaan yang akan dilakukan jika pengecualian yang tercantum dalam :not dinaikkan. Diutamakan :on .
kelas MyError <StandardError; endRetryable.Retryable (mencoba: 5, on: [StandardError], bukan: [myError]) lakukan Naikkan myError "No Retries!" Akhiri
:sleep_method untuk digunakanIni bisa sangat berguna ketika Anda bekerja dengan seluloid yang mengimplementasikan versi sendiri dari metode tidur.
Retryable.Retryable (sleep_method: celluloid.method (: sleep)) do # Kode di sini
Perpustakaan ini bertujuan untuk mendukung dan diuji terhadap versi Ruby berikut:
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
Catatan: Jika Anda perlu retryable untuk menjalankan Ruby 1.8 Gunakan versi GEM sebelum rilis 3.0.0
Jika ada sesuatu yang tidak berhasil pada salah satu versi ini, itu adalah bug.
Perpustakaan ini dapat bekerja secara tidak sengaja (atau tampaknya berfungsi) pada versi Ruby lainnya, namun dukungan hanya akan disediakan untuk versi yang tercantum di atas.
Jika Anda ingin perpustakaan ini mendukung versi atau implementasi Ruby lain, Anda dapat secara sukarela menjadi pengelola.