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

Ruby on rails Ruby 2.3-向net:http请求添加超时错误和通知,ruby-on-rails,ruby,ruby-on-rails-4,heroku,net-http,Ruby On Rails,Ruby,Ruby On Rails 4,Heroku,Net Http,我有一个工作系统,以产生错误,并将其发送给主动管理员使用 例如,在Active admin中,对于我们CMS的特定页面,该页面可能会执行: url_must_be_accessible("http://www.exmaple.com", field_url_partner, "URL for the partner") 这将使用下面的代码向活动的管理员编辑器发送不同类型的错误通知: module UrlHttpResponseHelper def url_must_be_accessib

我有一个工作系统,以产生错误,并将其发送给主动管理员使用

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

url_must_be_accessible("http://www.exmaple.com", field_url_partner, "URL for the partner")
这将使用下面的代码向活动的管理员编辑器发送不同类型的错误通知:

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秒时,如您尝试此链接“”,应用程序将崩溃,并出现错误

我想在代码中添加两件事 -超时:我想我需要读取超时和打开超时,读取超时+打开超时应该<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这样的代码,但另一个代码可以拯救我自己强制执行的“超时”/“放弃请求尝试”


我试过了,但没有效果。我无法为catch创建代码,如果达到25秒,则会删除此请求…

这不是一个很好的解决方案(请参阅:),但我相信您仍然可以在这里使用它,因为您在链接中的示例的正对面只发生了一件事,其中多个操作可能会导致不明显的行为:

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

您是否尝试用Timeout.Timeout{}`block包装您的
get\u url\u http\u响应(url)
?否不知道此方法!看起来确实和我的需要很相关。我们将查看并了解如何使用它。我还需要捕捉fatc超时使我当前系统发送通知的请求“下降”(见问题)hehe也在2分钟前偶然发现了这篇帖子:)他们在评论中说,即使我选择get_response read_timeout或write_timeout参数,ti仍将在后台超时中使用请注意,Net::HTTP仍在使用timeout作为打开超时,如中所示。。。至少read_timeout现在实现得更好了“它工作了!谢谢,将在22小时内分配点数,因为在那之前它被SO阻止。”