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编辑器发送不同类型的错误通知:

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秒,让我们采取一些安全措施,更好的是<25seconds

  • 如果请求在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秒,我就无法创建用于捕获和删除此请求的代码...

夜足

那不是一个非常漂亮的解决方案(请参阅: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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章