سؤال

أقوم بتطوير تطبيق صغير يقوم بنشر 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top