为什么我的Net :: HTTP.post_form超时?

时间:2014-03-25 19:53:48

标签: ruby-on-rails ruby

在我的rails app控制器中,我在同一台机器上发布到应用程序的api。我已经构建了这个来处理将数据发布到url:

url = "http://172.16.155.165:3000/api/jobs"
params = {
  :input => "original/video.h264",
  :output => "new/video.mp4",
  :preset => 'h264'
}

jobResults = Net::HTTP.post_form(URI.parse(url), params)

当我通过rails控制台运行此代码时,这很有用,但是当我在控制器中使用它时,在加载一分钟左右后会出现此错误:

Timeout::Error in SeminarsController#create
Timeout::Error

一旦发生超时,数据就会被发布,而api会做到应有的。它就像是挂起,直到它超时然后发布数据。控制器永远不会超越这一步。它应该将响应主体写入jobResults.body的文件,如果它没有超时则可以正常工作。如果我将其写入rails控制台,它会立即输出响应。 api永远不会花一分钟时间来回应。

我做了什么导致这种情况发生?我怎样才能让它正常工作?

修改 这是createapp/controllers/api/jobs_controller.rb的代码:

def create
  job = Job.from_api(params, :callback_url => lambda { |job| api_job_url(job) })
  if job.valid?
    response.headers["X-State-Changes-Location"] = api_state_changes_url(job)
    response.headers["X-Notifications-Location"] = api_notifications_url(job)
    respond_with job, :location => api_job_url(job) do |format|
      format.html { redirect_to jobs_path }
    end
  else
    respond_with job do |format|
      format.html { @job = job; render "/jobs/new"}
    end
  end
end

1 个答案:

答案 0 :(得分:1)

是。理想情况下,您应该将长时间运行的进程(是的,这是长时间运行的进程)删除到后台作业中。请记住,当许多用户开始更新视频时,此过程将显示出多种原因(如带宽,API接受率等)。如果进程超过阈值,Rake::Timeout总是会弹出。它实际上旨在中止响应时间过长的请求。而且,它不会在console中提出。

  

如何让它正常工作?

将其移至后台作业。或者你可以通过做这样的事情来明确地增加rake超时间隔

# config/initializers/timeout.rb
Rack::Timeout.timeout = 30  # seconds

但我建议不要这样做。这个rake-timeout有助于调试。主要是人们在heroku使用newrelic。