我知道Http.rb和Celluloid1目前不支持当前的超时,但是否有临时解决方法?
下面是我想要运行的代码:
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>))持开放态度,但这些方案似乎效率较低,实际上能够达到我正在寻找的目标。
发布于 2015-05-21 01:01:58
您可以在获取请求时为将来的调用设置超时
下面是如何在Http.rb和Celluloid-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}\n\n"
endhttps://stackoverflow.com/questions/30196545
复制相似问题