我可以让连接超时但仍能得到响应吗?

时间:2012-05-17 23:32:06

标签: ruby timeout

我有一个通过http获得响应的函数。它运行一些测试。最近它开始发生,测试永远不会完成。所以我介绍了一个时间。然后我发现如果我停止数据库服务器,测试脚本会以db错误结束,这实际上非常好,导致测试没有按预期完成。因此,获得错误可以帮助我节省时间。因为我不必再次手动重现整个测试。

Q1:有没有办法让连接超时,但是在重新启动数据库服务器后得到响应?请注意,我无法再次发送http请求,因为它会启动相同的文本试。

Q2:我认为解决方案是在“等待”http响应时引入计时器。但我不知道该怎么做。有什么想法吗?

我的功能就像

def execute_db2_script(url)
  db2_database = 'RATIONAL'
  http_read_timeout=$http_read_timeout
  uri = URI.parse(url)
  start = Time.new

  connection = Net::HTTP.new(uri.host, 443)
  connection.use_ssl = true
  begin 
    response = connection.start() do |http|
      http.open_timeout =  50
      http.read_timeout = http_read_timeout
      http.request_get(uri.request_uri)
    end
  rescue Timeout::Error
    time_out_message ="security time out - after #{$http_read_timeout} sec"
  return time_out_message       
  end       
  return response.body.gsub("\n","<BR>")
end

1 个答案:

答案 0 :(得分:2)

您可以使用retry关键字

def execute_db2_script(url)
  ...
  begin 
    ...
  rescue Timeout::Error
    time_out_message ="security time out - after #{$http_read_timeout} sec"
    if "the server is going to restart then"
      retry # this will restart begin-rescue-end block again
    else
      return time_out_message       
    end
  end       

  response.body.gsub("\n","<BR>")
end