Реализация Стратегии повторного подключения с использованием Ruby Net

StackOverflow https://stackoverflow.com/questions/1201486

Вопрос

Я разрабатываю небольшое приложение, которое отправляет XML в какой-нибудь веб-сервис.Это делается с помощью Net::HTTP::Post::Post .Однако поставщик услуг рекомендует использовать повторное подключение.

Что - то вроде:сбой 1-го запроса -> повторите попытку через 2 секунды сбой 2-го запроса -> повторите попытку через 5 секунд сбой 3-го запроса -> повторите попытку через 10 секунд ...

Каков был бы хороший подход для этого?Просто запускаете следующий фрагмент кода в цикле, перехватываете исключение и запускаете его снова через некоторое время?Или есть какой-нибудь другой умный способ сделать это?Может быть, Net package даже имеет какую-то встроенную функциональность, о которой я не знаю?

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

Другие советы

Я использую gem подлежащий повторной попытке для повторной попытки.С его помощью код, преобразованный из:

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