我想在我的ruby代码中覆盖服务调用的默认超时.我打开连接.
res = Net::HTTP.start(@@task_url.host, @@task_url.port) do |http|
http.get("/tasks/#{task_id}")
end
Run Code Online (Sandbox Code Playgroud)
我尝试将read_timeout时间设置为不足,但后来我的代码中出现了NoMethodError异常.
res = Net::HTTP.start(@@task_url.host, @@task_url.port)
res.read_timeout = 10
res do |http|
http.get("/tasks/#{task_id}")
end
Run Code Online (Sandbox Code Playgroud)
建议我如何设置read_timeout.我希望将read_timeout设置为全局,以便我可以通过Net :: HTTPP.start()将该超时用于我的所有服务调用
我把它一起作为一种表面上看起来很健壮的方式来调用一个不稳定的web服务,它会给出超时和偶尔的名称解析或套接字错误等等.我想我会把它放在这里以防它有用,或者更有可能被告知更好的方法来做到这一点.
require 'net/http'
retries = 5
begin
url = URI.parse('http://api.flakywebservice.com')
http = Net::HTTP.new(url.host, url.port)
http.read_timeout = 600 # be very patient
res = nil
http.start{|http|
req = Net::HTTP::Post.new(url.path)
req.set_form_data(params) # send a hash of the POST parameters
res = http.request(req)
}
rescue Exception # should really list all the possible http exceptions
sleep 3
retry if (retries -= 1) > 0
end
# finally, do something with res.body, like JSON.parse(res.body)
Run Code Online (Sandbox Code Playgroud)
这个问题的核心是:在打电话给这样的网络服务时,我应该寻找所有例外情况?这是尝试收集所有这些,但似乎必须有一个比这更好的方法:http: //tammersaleh.com/posts/rescuing-net-http-exceptions
相同的脚本不同的错误 这可能与我的网络而不是我的代码有关.脚本如下:
#!/usr/bin/env ruby -rubygems
require File.join(File.dirname(__FILE__), 'authentication')
require "csv" # faster_csv (ruby 1.9)
lines = CSV.read(File.join(File.dirname(__FILE__), 'karaoke.csv')) # Exported an Excel file as CSV
lines.slice!(0) # remove header line
collection = StorageRoom::Collection.find('collection ID')
Song = collection.entry_class
lines.each do |row|
karaoke = Song.new(:artist => row[0], :song => row[1], :genre => row[2], :file => StorageRoom::File.new_with_filename("#{karaoke.artist}#{karaoke.song}.mov"))
if karaoke.save
puts "Song saved: #{karaoke.artist}, #{karaoke.song}, #{karaoke.genre}"
else
puts "Song could not be saved: #{karaoke.errors.join(', ')}"
end
end
Run Code Online (Sandbox Code Playgroud)
错误是:
/usr/local/lib/ruby/1.9.1/net/protocol.rb:140:in `rescue in rbuf_fill': Timeout::Error (Timeout::Error) …Run Code Online (Sandbox Code Playgroud) 我正在使用此代码来抓取外部html文件
Run Code Online (Sandbox Code Playgroud)link = URI.parse(url) request = Net::HTTP::Get.new(link.path) response = Net::HTTP.start(link.host, link.port) {|http| http.request(request) }
效果很好,但网页速度慢有时会响应超时,所以我需要为每个连接设置一个超时限制.任何的想法?