使用HTTP.RB和赛璐oid进行超时的解决方法



我知道当前的超时是http.rb和赛璐oid [1],但是是否有临时解决方法?

这是我想运行的代码:

  def fetch(url, options = {} )
    puts "Request -> #{url}"
    begin
      options = options.merge({ socket_class: Celluloid::IO::TCPSocket,
                                timeout_class: HTTP::Timeout::Global,
                                timeout_options: {
                                  connect_timeout: 1,
                                  read_timeout: 1,
                                  write_timeout: 1
                                  }
                              })
      HTTP.get(url, options)
    rescue HTTP::TimeoutError => e
      [do more stuff]
    end
  end

它的目标是测试服务器的生活和健康。我会接受替代方案(例如%x(ping <server>)),但是这些似乎不太效率,实际上能够了解我想要的东西。

[1] https://github.com/httprb/http.rb#celluloidio-support

您可以在获取请求

的情况下设置以后的呼叫超时

这是如何使用http.rb和赛璐oid-io

使用超时
require 'celluloid/io'
require 'http'
TIMEOUT = 10 # in sec
class HttpFetcher
  include Celluloid::IO
  def fetch(url)
    HTTP.get(url, socket_class: Celluloid::IO::TCPSocket)
  rescue Exception => e
   # error
  end
end
fetcher = HttpFetcher.new
urls = %w(http://www.ruby-lang.org/ http://www.rubygems.org/ http://celluloid.io/)
# Kick off a bunch of future calls to HttpFetcher to grab the URLs in parallel
futures = urls.map { |u| [u, fetcher.future.fetch(u)] }
# Consume the results as they come in
futures.each do |url, future|
  # Wait for HttpFetcher#fetch to complete for this request
  response = future.value(TIMEOUT)
  puts "*** Got #{url}: #{response.inspect}nn"
end

最新更新