2012-11-13 57 views
2

我有一個ruby腳本已經作爲一個獨立的功能實現。 現在我想在我的rails環境中執行這個腳本,並且將它作爲後臺作業執行會帶來額外的困難,因爲它需要大量的時間處理。Rails執行腳本作爲後臺作業

添加delayed_job的寶石後,我tryied調用下面的句子:

delay.system("ruby my_script.rb") 

這是我的錯誤:

Completed 500 Internal Server Error in 95ms 
TypeError (can't dump anonymous module: #<Module:0x007f8a9ce14dc0>): 
    app/controllers/components_controller.rb:49:in `create' 

回答

4

從呼叫控制器won't workself.delay方法,因爲DJ會嘗試將你的控制器序列化到作業中。你最好創建一個類來處理你的任務然後標記其方法爲異步:

class AsyncTask 
    def run 
    system('ruby my_script.rb') 
    end 
    handle_asynchronously :run 
end 

在你的控制器:

def create 
    ... 
    AsyncTask.new.run 
    ... 
end 

readme的「Queing作業」一節中的第二個例子。

+0

好吧,我該如何調試它?在運行方法中,放置或記錄器不起作用。 – user1573607

+0

你試過用'Delayed :: Worker.logger'嗎? – Jef

+0

'Delayed :: Worker.logger「測試日誌」'應該在控制檯中寫入字符串,不是嗎? 這不起作用。順便說一句,我已經實施了異步任務Erez後,方法是一樣的? – user1573607

0

就像傑夫所說的最好的解決方案是創建一個自定義作業。 與傑夫的回答的問題是,它的語法(據我所知)是不正確的,這就是他的工作處理一個單一的系統命令,而下面將讓你更多的自定義:

# lib/system_command_job.rb 
class SystemCommandJob < Struct.new(:cmd) 
    def perform 
    system(cmd) 
    end 
end 

注意的cmd參數Struct初始化器。它允許你傳遞參數到你的工作,所以代碼看起來像:

Delayed::Job.enqueue(SystemCommandJob.new("ruby my_script.rb")) 
+0

埃雷茲,(據我可以告訴;))'handle_asynchronously'是正確使用時(從DJ README引用「的方法應該總是在後臺運行」),我試圖用簡潔的代碼並靠近提供的例子來回答由文件 – Jef

+0

Erez,調試Delayed :: Worker.logger不工作,任何想法? – user1573607