2012-10-08 33 views
1

我設計下的Rails 3.2.8的web服務,將針對用戶執行外部程序,預期使用情況是:的Rails 3異步外部程序

1)用戶填寫的參數表,並提交請求

2)Rails根據用戶請求執行Matlab程序。它會持續幾分鐘(少於3分鐘),並生成一個結果文件,顯示程序已完成

3)在此過程中,將用戶重定向到頁面顯示「加載」狀態,並監視結果文件是否有已生成

4)生成結果文件後,通過AJAX重新加載頁面並顯示結果。

有沒有「軌道」的方式來做到這一點?我之前在JAVA SSH框架中做過這個,但是非常痛苦。我需要什麼工具?例如,我是否需要像backgroundjob 這樣的寶石來管理任務隊列?或者有沒有「一站式」寶石可以處理這個問題?謝謝!

+0

您可以使用Resque管理後臺任務,並像劍聖(儘管它過時了,讀了筆者的建議GitHub的頁面)將數據推送到客戶端時,後臺作業完成。 –

+0

你可能全都在這,但以防萬一:爲*非常小心*有這樣的,你不把任何unsanitised數據輸入到表格到您的命令行的東西,否則你是一個「RM - rf/*'遠離災難...... –

+0

謝謝保羅,我會非常小心的對我的驗證:)。同樣感謝saverio,在接下來的兩天裏我有點忙,但是會盡快嘗試你的建議,看看是否接受它。 – Xiaoli

回答

0

使用多個作業隊列提供程序之一。例子包括DelayedJob(有史以來最簡單的一個,不需要額外的部分),Resque和Sidekiq(速度更快,但你需要一個小的Redis服務器來使用它們)。

「作業」將(取決於提供者)實現執行的類或實例。如果它意味着在shell中運行的東西,你可以不喜歡它

%x[matlab command --options > output.ext] 

(這只是一個例子,你可以用串插過:%x[#{executable_name}]

+0

嗨@saverio,我看到DelayedJob適合管理隊列。但是,我沒有看到它提供的很多監視功能。我如何知道任務是否結束?我要監聽DJ數據庫嗎?對於我的用例,每次用戶啓動任務時,都會構建一個帶時間戳的任務文件夾,並在該文件夾中生成所有結果文件。所以'加載'頁面也應該繼續監視文件夾。看來我們無法將時間戳存儲在DJ數據庫中嗎? (Matlab是痛苦的,因爲它似乎無法被重定向到標準輸出,或者這將是一個容易得多...) – Xiaoli

+0

也是另一個問題是,如果我們使用%×[]開始MATLAB,它將由算是完成DJ一旦MATLAB程序開始運行(而不是當計算真正完成) – Xiaoli

+0

每個隊列系統有其自身的特點,如果DJ沒有足夠的監控,請選擇其它,或者只是做了'matlab'處理完畢後,有關的東西。 – rewritten

0

我有點想通了,整個過程中要使用什麼過程:

1)用戶填寫的參數的形式,並提交請求

使用的方法,從該軌道鑄造:http://railscasts.com/episodes/219-active-model用於服務器端驗證和寶石'客戶端驗證'來啓用客戶端檢查。

2)Rails根據用戶請求執行Matlab程序。它會持續幾分鐘(少於3分鐘),並生成結果文件顯示程序已完成

使用gem'DelayedJob'進行任務管理並使用'ChildProcess'啓動Matlab程序。

3)在此過程中,重定向用戶到一個頁面顯示「加載」狀態,並監控如果結果文件已經生成

監測子進程以及結果文件的存在檢查任務是否完成。

4)生成結果文件後,通過AJAX重新加載頁面並顯示結果。

使用輪詢方法從這個rails cast:http://railscasts.com/episodes/229-polling-for-changes更新結果頁面。我不使用推送,但它會更安全 - 因爲投票似乎是一種更輕量級的解決方案,並且可以滿足我的要求。

顯然,這不是最好的做法,但滿足我的需求,易於實現。感謝所有的評論和答覆。