Использование Net :: HTTP в Rails 3.0.3 приводит к Timeout :: Error - PullRequest
2 голосов
/ 30 января 2011

Я экспериментирую с Net :: HTTP в Rails 3.0.3 , но не могу заставить его работать из-за Timeout :: Error.

У меня есть два контроллера: контроллер 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

Хорошо, на этом этапе "req.body" не требуется, поскольку контроллером B возвращается только статический XML. Однако динамически сгенерированный XML будет отправлен на контроллер 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) "

Ответы [ 2 ]

4 голосов
/ 30 января 2011

Вы размещаете свое текущее приложение?Если это так, вам, вероятно, нужно убедиться, что у вас есть как минимум два внутренних процесса, обрабатывающих запросы, в противном случае этот один метод заблокирует сам себя.Если у вас есть два внутренних процесса, обрабатывающих запросы, то вам лучше надеяться, что они не выполняют один и тот же запрос;) и т. Д.

0 голосов
/ 12 марта 2015

Для тех, у кого есть проблемы с таймаутами NET :: HTTP, когда, например, при запуске API и подключении к нему через HTTP в том же приложении предполагается, что Unicorn является выбранным сервером (уверен, что аналогичный метод будет работать с другими) добавить следующее к config/unicorn.rb:

worker_processes 2

Конечно, вы можете иметь> 2 процесса, но минимум 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...