ruby-on-rails - 在 Rails 3.0.3 中使用 Net::HTTP 会导致 Timeout::Error

标签 ruby-on-rails timeout

我正在 Rails 3.0.3 中试验 Net::HTTP,但由于 Timeout::Error 无法使其工作。

我有两个 Controller : Controller A 由 Controller B 调用。

Controller 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。

Controller 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

好吧,此时不需要“req.body”,因为 Controller B 仅返回静态 XML。但是,动态生成的 XML 将来会发送到 Controller A 并进行相应处理,所以我保留了它英寸。

我还定义了一条路线:

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

一旦我调用“http://0.0.0.0:3000/mains/search”,我就会收到超时::错误。

日志显示:

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)

根据日志,调用 Controller B 并返回 XML(日志中的最后一行)。

但是,是什么导致了Timeout::Error?这当然不是处理时间不足的“超时”。有些东西卡在某个地方,很可能是在“res = http.request(req)”行

最佳答案

您是否在“当前应用程序”中发布内容?如果是,您可能需要确保至少有两个后端进程处理请求,否则该方法将自行锁定。如果您有两个后端进程处理请求,那么您最好希望它们不会都发出相同的请求;)等等。

关于ruby-on-rails - 在 Rails 3.0.3 中使用 Net::HTTP 会导致 Timeout::Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842355/

相关文章:

shell - 如何在多台机器上批量运行许多 SSH 远程命令?

javascript - 模拟 JavaScript 的 setTimeout() 方法 “from first principles”

javascript - PUPPETEER - 循环内的随机设置超时不起作用

mysql - Rails Query 选择最新记录的最佳方法

ruby-on-rails - 无法连接到Geckodriver

ruby-on-rails - Rails Rich Association - 覆盖关联模型

javascript - session过期如何防止表单数据丢失?

ruby-on-rails - 为什么 attr_accessor 会破坏 Ruby on Rails 中此模型中的现有变量?

ruby-on-rails - 如何将图像字段添加到 Rails 应用程序中?

java - java.net.Socket.setSoTimeout 可靠吗?