يقوم بتشغيل كتلة التعليمات البرمجية ، ويحدده عند حدوث استثناء. إنه أمر رائع عند العمل مع Flakey WebServices (على سبيل المثال).
تم تكوينه باستخدام العديد من المعلمات الاختيارية :tries ، :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جرب الكتلة إلى الأبد.
# لإصدارات Ruby قبل 1.9.2 الاستخدام: Infinite Symbol بدلاً من ذلك # الكود في الوصف
افعل شيئًا ما ، قم بإعادة محاولة ما يصل إلى أربع مرات من أجل إما ArgumentError أو Timeout::Error Stists.
Retryable.Bresable (المحاولات: 5 ، ON: # الكود في الوصف
تأكد من تنفيذ كتلة الكود ، بغض النظر عما إذا كان قد تم رفع استثناء. لا يهم ما إذا كانت الكتلة تخرج بشكل طبيعي ، إذا تم إعادة تشغيلها لتنفيذ كتلة التعليمات البرمجية ، أو إذا تم إنهاءها باستثناء استثناء غير معطل - فسيتم تشغيل :ensure من تشغيل الكتلة.
f = file.open ("testFile") Supply_cb = proc do | recries | يضع "محاولات إعادة المحاولة الكلية: #{Retries}"
f.closeendretryable.retryable (تأكد: تأكد من ذلك
# Process FileEndcontexts: {},
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بشكل افتراضي ، ينتظر إعادة إعادة المحاولة لمدة ثانية واحدة بين إعادة المحاولة. يمكنك تغيير هذا وحتى توفير خطة التراجع الأسية الخاصة بك.
Retryable.retryable (النوم: 0) {} # لا تتوقف على الإطلاق بين إعادة retriesretry. {} # sleep 1 ، 4 ، 16 ، إلخ. كل محاولةيمكنك أيضًا إعادة المحاولة بناءً على رسالة الاستثناء:
Retryable.Retryable (مطابقة: /مهلة IO /) do | إعادة المحاكاة ، استثناء | ارفع "OOPS IO Timeout!" إذا كانت إعادة المحاكاة == 0 end#تدعم المباراة تنسيق المصفوفة أيضًا: Retryable. ارفع "OOPS IO Timeout!" إذا كانت إعادة المحاولة == 0
تم استدعاء الكتلة الخاصة بك مع معلمتين اختياريتين: عدد المحاولات حتى الآن ، والاستثناء الأخير.
RETRYABLE. يضع "Try #{Retries} فشل باستثناء: #{استثناء}" if receptires> 0
# الكود في الوصف استثناء _cb = Proc do | استثناء | # http://smartinez87.github.io/exception_notification
استثناء notifier.notify_exception (استثناء ، البيانات: {message: "لقد فشل"})
# الكود في الوصف # أو استخراجها إلى Global Config بدلاً من ذلك: log_method = lambda do | recries ، استثناء | logger.new (stdout) .debug ("[محاولة ## {receptire}] Retrying لأن [ #{atcistric.class} - #{incentive.message}]: #{incentation.backtrace.first (5) .join ('' | ارفع "OOPS IO Timeout!" إذا كانت إعادة المحاكاة == 0 end #d ، [2018-09-01t18: 19: 06.093811 #22535] debug-: `block in irb_binding '| /home/nikita/projects/retryable/lib/retryable.rb:73:in `receplable '| (IRB#1): 6: في `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 `تقييم 'إذا كنت تفضل استخدام المسجل الأصلي لـ Rails:
log_method = lambda do | restries ، استثناء | Rails.logger.debug ("[المحاولة ## {receptire}] Retrying لأن [ #{incentire.class} - #{incctect.message}]: #{stispion.backtrace.first (5) .join ('|') }")نهاية تتيح Retryable.retryable السياقات استخراج خيارات الاتصال المشتركة.
Retryable.configure do | config | config.contexts [: faulty_service] = {on:
} endretry.with_context (: fault_service) {
# الكود هنا}يمكنك أيضًا تجاوز الخيارات المحددة في سياقاتك:
#: ON & Sleep المحددة في السياق في وقت سابق لا تزال effectivertryable.with_context (: FAUNTY_SERVICE ، المحاولات: 999) {
# الكود هنا}receplable.endabled؟ => trueretry
لن يتم إجراء مزيد من المحاولات إذا تم طرح استثناء مدرج في :not يتم رفعه. يأخذ الأسبقية :on .
فئة myerror <standarderror ؛ endretry. ارفع myerror "لا إعادة المحاولة!"
:sleep_method للاستخداميمكن أن يكون هذا مفيدًا للغاية عندما تعمل مع السليلويد الذي ينفذ نسخته الخاصة من طريقة النوم.
Retryable.brateable (sleep_method: celluloid.method (: Sleep)) do # الكود في الوصف
تهدف هذه المكتبة إلى الدعم واختبارها مقابل إصدارات روبي التالية:
روبي 3.3
روبي 3.2
روبي 3.1
روبي 3.0
روبي 2.7
روبي 2.6
روبي 2.5
روبي 2.4
روبي 2.3
روبي 2.2
روبي 2.1
روبي 2.0
ملاحظة: إذا كنت بحاجة إلى retryable لتشغيلها على Ruby 1.8 ، فاستخدم إصدارات GEM قبل الإصدار 3.0.0
إذا كان هناك شيء لا يعمل على أحد هذه الإصدارات ، فهذا خطأ.
قد تعمل هذه المكتبة عن غير قصد (أو يبدو أنها تعمل) على إصدارات Ruby الأخرى ، ومع ذلك لن يتم تقديم الدعم إلا للإصدارات المذكورة أعلاه.
إذا كنت ترغب في دعم هذه المكتبة نسخة أو تطبيق Ruby آخر ، فيمكنك التطوع لتكون مشرفًا.