2014-10-03 137 views
2

我有一些代碼可能會運行更長的時間。但是,如果它確實我要殺死它,這裏是我做的那一刻是什麼:在延遲作業中超時

def perform 
    Timeout.timeout(ENV['JOB_TIMEOUT'].to_i, Exceptions::WorkerTimeout) { do_perform } 
    end 

私人 高清do_perform ...一些代碼... 結束

哪裏JOB_TIMEOUT是具有值的環境變量,如10.seconds。我有報道說這仍然不能阻止我的工作繼續運行。

有沒有更好的方法來做到這一點?

回答

2

我相信delayed_job的做了一些異常處理巫術與多次重試等,更何況我認爲do_perform將立即返回,作業將繼續像往常一樣在另一個線程。我會想象一個更好的方法是在工作人員內部進行流量控制。

def perform 
    # A nil timeout will continue with no timeout, protect against unset ENV 
    timeout = (ENV['JOB_TIMEOUT'] || 10).to_i 

    do_stuff 

    begin 
    Timeout.timeout(timeout) { do_long_running_stuff } 
    rescue Timeout::Error 
    clean_up_after_self 
    notify_business_logic_of_failure 
    end 
end 

這會起作用。增加的好處不是將delayed_job與您的業務邏輯緊密地結合在一起 - 這些代碼可以移植到任何未經修改的其他作業排隊系統。