【问题标题】:Can I let the connection time out but still get the response?我可以让连接超时但仍然得到响应吗?
【发布时间】:2023-03-26 04:55:01
【问题描述】:

我有一个通过 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

【问题讨论】:

  • 如果您pass a block to request_get(),在超时之前您是否收到任何响应?
  • 如果我在浏览器中使用相同的 url,我将一无所获,直到我重新启动数据库服务器。该测试包含所有其他测试,因此我需要强制完成它。超时没问题,但我想要错误消息。
  • 哇,听起来坏了。我不会尝试修复测试,听起来需要修复处理请求的数据库服务器或 Web 服务器......
  • 是的,它坏了,测试发现它是这样的。 ;-) 它并不总是发生。它现在开始发生了,程序员还没有修复它,所以我必须在我的测试中适应它。

标签: ruby timeout


【解决方案1】:

你可以使用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

【讨论】:

  • 会重试发送另一个http请求吗?应该是一样的吧,我猜。如果我在浏览器中使用相同的 url,在我重新启动数据库服务器之前我什么也得不到。所以我不确定重试是否可以在这里工作。
  • 哈,我不是一个 ruby​​ 程序员想要写一个 while 循环。重试很棒。他可能仍然想要一个失败计数器(取决于他的代码)。
  • @Radek:失败计数器是一种让您只执行 retry 操作三到四次的方法 - 并防止 that 也阻止您的测试...
  • 哦,听起来不错。我可以在“重试”开始之前运行一些代码吗?嗯,但我无法发送另一个 http 请求,它会再次开始相同的测试。我需要等待......
  • @Radek,看起来你不知道重试,begin-rescue 部分首先执行,然后是rescue-end 部分。在最后一部分中,您可以决定下一步要做什么 - 再次运行第一部分(例如,使用失败计数器或者您可以休眠一段时间)或退出该方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2013-10-21
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多