2011-01-30 61 views
2

我正在使用Net :: HTTP在Rails 3.0.3中進行試驗,但由於Timeout ::錯誤。在Rails 3.0.3中使用Net :: HTTP導致超時::錯誤

我有兩個控制器:控制器A通過控制器B.

控制器A(xml_provider_controller.rb)稱爲:

class XmlProviderController < ApplicationController 
    def availabilityByDateRequest 
    respond_to do |format| 
     format.xml # availabilityByDateRequest.xml.builder 
    end 
    end 
end 

文件 「availabilityByDateRequest.xml.builder」 是一個簡單的靜態XML哪些工作。

控制器B(mains_controller.rb):

require 'nokogiri' 
require 'net/http' 
require 'uri' 
require "logger" 

class MainsController < ApplicationController 

    def search 

    url = URI.parse("http://127.0.0.1:3000/xmlprovider/availabilityByDateRequest/") 
    http = Net::HTTP.new(url.host, url.port) 
    http.open_timeout = 10 # in seconds 
    http.read_timeout = 10 # in seconds 
    req = Net::HTTP::Post.new(url.path, 
           initheader = {'Content-Type' => 'application/xml', 
              'Accept' => 'application/xml'}) 
    req.body = "<?xml version='1.0' encoding='UTF-8'?><somedata></somedata>" 
    res = http.request(req) 

    logger.debug res.body 

    xml_doc = Nokogiri::XML(res.body) 
    @results = xml_doc.xpath('//startLocation') 

    respond_to do |format| 
     format.html # search.html.erb 
    end 

    end 
end 

好的,因爲只有一個靜態XML是由控制器B返回但是沒有在這一點上需要「req.body」,動態生成的XML將。被髮送到控制器A和在未來相應地處理,所以我離開它在

我還定義了一個路線:

match 'xmlprovider/availabilityByDateRequest' => 'xml_provider#availabilityByDateRequest', :via => :post, :format => 'xml' 

一旦我稱爲「http://0.0.0.0:3000/mains/search「,我得到一個Timeout :: Error。

日誌說:

Started GET "/mains/search" for 127.0.0.1 at 2011-01-30 10:48:17 +0100 
opening connection to localhost... 
opened 
<- "POST /xmlprovider/availabilityByDateRequest/ HTTP/1.1\r\nAccept: */*\r\nUser-Agent: Ruby\r\nConnection: close\r\nHost: localhost:3000\r\nContent-Length: 136\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" 
<- "<?xml version='1.0' encoding='UTF-8'?><somedata></somedata>" 
Conn close because of error Timeout::Error 
Timeout::Error (Timeout::Error): 
    app/controllers/mains_controller.rb:43:in `search' 
Processing by MainsController#search as HTML 
... 
Started POST "/xmlprovider/availabilityByDateRequest/" for 127.0.0.1 at 2011-01-30 10:48:27 +0100 
    Processing by XmlProviderController#availabilityByDateRequest as XML 
    Parameters: {"<?xml version"=>"'1.0' encoding='UTF-8'?><somedata><name>Test Name 1</name><description>Some data for Unit testing</description></somedata>"} 
Rendered xml_provider/availabilityByDateRequest.xml.builder (8.8ms) 
Completed 200 OK in 14ms (Views: 13.9ms | ActiveRecord: 0.0ms) 

根據日誌,控制器B被調用,並返回XML(最後一行在日誌中)。

但是,什麼導致Timeout :: Error?就處理時間不足而言,這肯定不是「超時」。一些東西卡在某處,最有可能在線「res = http.request(req)

回答

4

您是否正在發佈到您的'當前應用程序'?如果你是,你可能需要確保你至少有兩個後端進程處理請求,否則這個方法會自己鎖定。如果您有兩個後端進程處理請求,那麼您最好希望他們不要同時提出這個請求;)等等。

+0

就是這樣......我建立了一個單獨的rails應用程序...... – Scholle 2011-01-30 13:27:51

0

對於任何有NET :: HTTP超時問題的人,例如,在同一個應用程序中運行API並通過HTTP連接到它時,假設Unicorn是選定的服務器(肯定有類似的方法可以與其他人一起工作)以下添加到config/unicorn.rb

worker_processes 2 

當然,你可以有> 2點的過程,但2是最小的。

相關問題