Ruby 2.3 – 向net:http请求添加超时错误和通知

我有一个工作系统来产生错误并将它们发送给Active Admin使用。

例如,在Active admin中,对于CMS的特定页面,页面可能会执行:

url_must_be_accessible("http://www.exmaple.com", field_url_partner, "URL for the partner") 

这使用下面的代码向Active Admin Editor发送不同类型的错误通知:

 module UrlHttpResponseHelper def url_must_be_accessible(url, target_field, field_name) if url url_response_code = get_url_http_response(url).code.to_i case url_response_code when -1 # DNS issue; website does not exist; errors.add(target_field, "#{field_name}: DNS Problem -> #{url} website does not exist") when 200 return when 304 return else errors.add(target_field, "#{field_name}: #{url} sends #{url_response_code} response code") end end end def get_url_http_response(url) uri = URI.parse(URI.encode(url)) request = Net::HTTP.get_response(uri) return request rescue Errno::ECONNREFUSED, SocketError => e OpenStruct.new(code: -1) end end 

在本地模式下,这非常有用! 但是在制作中,我们使用Heroku,当一个请求pn Heroku超过30秒时就好像你试试这个链接“ http://www.exmaple.com ”一样,应用程序崩溃了“H12错误” 。

我想在上面添加两个代码 – 超时:我认为我需要read_timeout和open_timeout,并且read_timeout + open_timeout应该<到30秒,让我们采取一些安全措施,更好<25秒

  • 如果请求在25秒后仍“继续”,则通过放弃/删除请求避免达到30秒

  • 并通过向用户发送通知来捕获“我们故意放弃请求,因为超时风险”。 我想使用我当前的系统,其中包括:

      rescue Errno::ECONNREFUSED, SocketError => e OpenStruct.new(code: -7) # = some random number end case url_response_code when -7 errors.add(target_field, "#{field_name}: We tried to reach #{url} but this takes too long and risks crashing the app. please check the url and try again.") 

我怎样才能创建像-1这样的代码,而另一个代码来拯救我自己强制执行的“超时”/“丢弃请求尝试”。

尝试但没有任何作用。 如果达到25秒,我无法创建catch的代码并删除此请求…

这不是一个非常漂亮的解决方案(参见: https : //medium.com/@adamhooper/in-ruby-dont-use-timeout-77d9d4e5a001 ),但我相信你仍然可以在这里使用它,因为你里面只发生了一件事与链接中的示例相反,其中多个操作可能导致非显而易见的行为:

 def get_url_http_response(url) uri = URI.parse(URI.encode(url)) request = Timeout.timeout(25) { Net::HTTP.get_response(uri) } return request rescue Errno::ECONNREFUSED, SocketError => e OpenStruct.new(code: -1) rescue Timeout::Error # return here anything you want end