使用Ruby Net实现重新连接策略

时间:2009-07-29 16:30:55

标签: ruby webservice-client reconnect

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

像: 第一个请求失败 - > 2秒后再试一次 第二次请求失败 - > 5秒后再试一次 第3次请求失败 - > 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)}

非常感谢,一定感谢您的支持。

马特

2 个答案:

答案 0 :(得分:15)

这是Ruby 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

答案 1 :(得分: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