2013-03-01 2 views
12

Ich möchte das Standard-Timeout für den Service-Aufruf in meinem Ruby-Code überschreiben. Ich öffne Verbindung wie unter.Setzen Sie read_timeout für den Service-Aufruf in Ruby Net :: HTTP.start

res = Net::HTTP.start(@@task_url.host, @@task_url.port) do |http| 
    http.get("/tasks/#{task_id}") 
end   

Ich versuchte, die read_timeout Zeit wie unter gesetzt, aber dann bekam ich die NoMethodError Ausnahme in meinem Code.

res = Net::HTTP.start(@@task_url.host, @@task_url.port) 
res.read_timeout = 10 
res do |http| 
    http.get("/tasks/#{task_id}") 
end 

vorschlagen mir, wie soll ich das read_timeout gesetzt. Und ich bin auf der Suche die read_timeout irgendwo global zu setzen, so dass ich das Timeout für alle meine Service-Aufruf durch Net können :: HTTPP.start()

+0

möglich Duplikat [Ruby-Net :: HTTP-Zeitüberschreitung] (http: // stackove rflow.com/questions/2229194/ruby-netthttp-time-out) auch mit HTTP.start, setzen Sie auch 'read_timeout'. –

Antwort

15

Wenn Sie Ruby 1.8 Sie haben Net::HTTP.new verwenden:

http = Net::HTTP.new(host, port) 
http.read_timeout = 10 

response = http.get("/")  
# or intead of above line if you need block 
# http.start do 
# response = http.get("/") 
# end 

Wenn Sie die source code von Net::HTTP.start anschauen, werden Sie sehen, dass ::start ruft nur ::new mit #start Methode:

# File net/http.rb, line 439 
def HTTP.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) # :yield: +http+ 
    new(address, port, p_addr, p_port, p_user, p_pass).start(&block) 
end 

> = Rubin 1,9

können Sie setzen read_timeout in opt argument: start(address, ..., opt, &block)

wie folgt aus:

res = Net::HTTP.start(host, port, :read_timeout => 10) 
+0

Ich erhalte den Fehler "kann Hash in String nicht konvertieren" – manyu

+0

Können Sie irgendwo (gist.github.com) ein Stück Code posten, das Sie versuchen? –

+0

Versuchen Sie 'irb', nur' erfordern "net/http"; res = Net :: HTTP.start (Ihr_Host, Ihr_Port,: read_timeout => 10) 'wenn es funktioniert. –

1

Sie open von OpenURI nutzen könnten. Diese Methode hat eine :read_timeout Option. Ich kann die Option nicht global festlegen, aber Sie können sie in eine benutzerdefinierte Funktion einfügen, die diese Option festlegt.

require 'open-uri' 
module NetCustom 

    def open_url(url, &task) 
    open(url, :read_timeout => 20) do |file| 
     yield file.read 
    end 
    end 

end 

Verbrauch:

class Foo 
    include NetCustom 

    def bar 
    open_url('http://example.org/tasks/') do |content| 
     # Handle page text content 
    end 
    end 
end 
+0

danke, aber ich möchte es nur beim Start tun. – manyu

Verwandte Themen