2014-03-25 53 views
0

在我的Rails應用程序控制器中,我發佈到同一臺機器上的應用程序的api。我已經建立了這一點來處理數據的發佈到網址:爲什麼我的Net :: HTTP.post_form超時?

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) 

,當我通過鐵軌控制檯運行這段代碼,但是當我在我的控制器使用它,它加載了之後給了我這個錯誤這個偉大的工程分鐘左右:

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

是。理想情況下,您應該將長時間運行的進程(是的,這是長時間運行的進程)移除到後臺作業中。請記住,當許多用戶開始更新視頻時,這個過程會出現許多原因(如帶寬,API接受率等)。如果過程超過閾值,則總是彈出Rake::Timeout。它實際上旨在放棄需要很長時間才能做出響應的請求。而且,它不會在console中提出。

我該如何讓它正常工作?

將其移動到後臺作業。或者你可以通過做這樣的事情明確地增加耙機超時間隔

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

但我建議不要這樣做。這rake-timeout有助於調試。主要是人們用heroku與newrelic。

+0

我實際上將超時設置爲500,它仍然超時。我只是在做測試。控制檯在一秒鐘內執行此操作,但該應用程序無法在500中執行此操作。我認爲還有其他功能可以保存我的應用程序。我只是不知道它會是什麼。在後臺運行這是理想的。我會尋找正確的方式來做到這一點。謝謝您的幫助。我想我可能會用'curl -d ...'在反引號中運行一個系統調用,並且只能解決無法使用返回值的問題。 –

相關問題