在我的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永远不会花一分钟时间来回应。
我做了什么导致这种情况发生?我怎样才能让它正常工作?
修改
这是create
中app/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
答案 0 :(得分:1)
是。理想情况下,您应该将长时间运行的进程(是的,这是长时间运行的进程)删除到后台作业中。请记住,当许多用户开始更新视频时,此过程将显示出多种原因(如带宽,API接受率等)。如果进程超过阈值,Rake::Timeout
总是会弹出。它实际上旨在中止响应时间过长的请求。而且,它不会在console
中提出。
如何让它正常工作?
将其移至后台作业。或者你可以通过做这样的事情来明确地增加rake超时间隔
# config/initializers/timeout.rb
Rack::Timeout.timeout = 30 # seconds
但我建议不要这样做。这个rake-timeout
有助于调试。主要是人们在heroku使用newrelic。