2011-02-04 62 views
13

我正在運行延遲作業工。當我調用foo方法時,工作人員打印hello延遲作業:如何在開發模式下每次調用期間重新加載有效載荷類

class User 
    def foo 
    puts "Hello" 
    end 
    handle_asynchronously :foo 
end 

如果我做了一些更改foo方法,我必須重新啓動工人的變化來反映。在開發模式中,這可能變得非常煩人。

我想找到一種方法來重新載入每個請求的有效載荷類(在這種情況下,用戶類)。我試圖在調用payload方法之前調用DelayedJob庫來調用require_dependency

module Delayed::Backend::Base 
    def payload_object_with_reload 
    if Rails.env.development? and @payload_object_with_reload.nil? 
     require_dependency(File.join(Rails.root, "app", "models", "user.rb")) 
    end 
    @payload_object_with_reload ||= payload_object_without_reload 
    end 
    alias_method_chain :payload_object, :reload 
end 

這種做法並不如使用require_dependency需要註冊類工作,以調用之前重新加載,我還沒有想出如何做到這一點。我花了一些時間閱讀調度程序代碼,找出Rails如何爲每個請求重新加載類。我無法找到重新加載代碼。

有沒有人試過這個?你會如何建議我繼續?或者你有任何指針來定位Rails類重載代碼?

回答

19

我設法找到解決方案。我用ActiveSupport::Dependencies.clear方法清除加載的類。

添加一個名爲config/initializers/delayed_job.rb

Delayed::Worker.backend = :active_record 
if Rails.env.development? 
    module Delayed::Backend::Base 
    def payload_object_with_reload 
     if @payload_object_with_reload.nil? 
     ActiveSupport::Dependencies.clear 
     end 
     @payload_object_with_reload ||= payload_object_without_reload 
    end 
    alias_method_chain :payload_object, :reload 
    end 
end 
+1

謝謝!這很好,即使在後端使用mongoid。我只需要刪除它的第一行工作:) – 2011-07-28 04:18:05

1

隨着4.0.6版本,DelayedJob自動重新加載,如果Rails.application.config.cache_classes是設置爲false

在開發模式下,如果您使用的是Rails 3.1+,您的應用程序代碼將自動重新加載每100個作業或隊列完成時。每次在開發中更新代碼時,不再需要重新啓動延遲作業。