我正在经营一名工作延迟的工人。当我调用foo
方法时,工作人员打印hello
。
class User
def foo
puts "Hello"
end
handle_asynchronously :foo
end
如果我对foo
方法进行了一些更改,我必须重新启动工作人员才能反映更改。在开发模式中,这可能变得非常烦人。
我试图找到一种方法来为每个请求重新加载有效载荷类(在本例中为User类)。我尝试使用Monkey修补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类重载代码吗?
答案 0 :(得分: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 :(得分:1)
从版本4.0.6开始,如果Rails.application.config.cache_classes
设置为false
,则DelayedJob会自动重新加载:
在开发模式下,如果您使用的是Rails 3.1+,您的应用程序代码将自动重新加载每100个作业或队列完成时。每次更新开发中的代码时,都不再需要重新启动延迟作业。
答案 2 :(得分:0)
看起来它没有alias_method hackery就解决了你的问题: