Реализация стратегии повторного подключения с использованием Ruby Net - PullRequest
6 голосов
/ 29 июля 2009

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

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

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

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)}

Большое спасибо, всегда ценю вашу поддержку.

Мэтт

Ответы [ 2 ]

15 голосов
/ 29 июля 2009

Это один из редких случаев, когда Ruby's 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
2 голосов
/ 21 мая 2013

Я использую gem retryable для повторной попытки. При этом код преобразуется из:

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
...