تنفيذ استراتيجية إعادة الاتصال باستخدام Ruby Net
-
05-07-2019 - |
سؤال
أقوم بتطوير تطبيق صغير يقوم بنشر XML على بعض خدمات الويب.ويتم ذلك باستخدام Net::HTTP::Post::Post.ومع ذلك، يوصي مزود الخدمة باستخدام إعادة الاتصال.
شيء مثل:فشل الطلب الأول -> حاول مرة أخرى بعد فشل الطلب الثاني ثانياً -> حاول مرة أخرى بعد 5 ثوانٍ فشل الطلب الثالث -> حاول مرة أخرى بعد 10 ثوان ...
ما هو النهج الجيد للقيام بذلك؟ما عليك سوى تشغيل الجزء التالي من التعليمات البرمجية في حلقة، والتقاط الاستثناء وتشغيله مرة أخرى بعد فترة من الوقت؟أم أن هناك أي طريقة ذكية أخرى للقيام بذلك؟ربما تحتوي حزمة Net على بعض الوظائف المضمنة التي لست على علم بها؟
url = URI.parse("http://some.host")
request = Net::HTTP::Post.new(url.path)
request.body = xml
request.content_type = "text/xml"
#run this line in a loop??
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
شكرا جزيلا، نقدر دعمكم دائما.
غير لامع
المحلول
وهذه هي واحدة من المناسبات النادرة عندما يأتي retry
روبي في متناول اليدين. شيء على طول هذه الخطوط:
retries = [3, 5, 10]
begin
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
rescue SomeException # I'm too lazy to look it up
if delay = retries.shift # will be nil if the list is empty
sleep delay
retry # backs up to just after the "begin"
else
raise # with no args re-raises original error
end
end
نصائح أخرى
أنا استخدم جوهرة قابل لإعادة المحاولة لإعادة المحاولة.معها تحول الكود من:
retries = [3, 5, 10]
begin
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
rescue SomeException # I'm too lazy to look it up
if delay = retries.shift # will be nil if the list is empty
sleep delay
retry # backs up to just after the "begin"
else
raise # with no args re-raises original error
end
end
ل:
retryable( :tries => 10, :on => [SomeException] ) do
response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
end