6

我正在开发一个将 XML 发布到一些 web 服务的小型应用程序。这是使用 Net::HTTP::Post::Post 完成的。但是,服务提供商建议使用重新连接。

类似于:第一个请求失败-> 2 秒后重试第二个请求失败-> 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)}

非常感谢,永远感谢您的支持。

马特

4

2 回答 2

15

retry这是 Ruby派上用场的罕见场合之一。这些方面的东西:

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
于 2009-07-29T18:45:09.873 回答
2

我使用 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
于 2013-05-21T06:02:02.597 回答