Har*_*tty 13 ruby-on-rails delayed-job
我正在经营一名工作延迟的工人.当我调用该foo方法时,工作人员打印hello.
class User
def foo
puts "Hello"
end
handle_asynchronously :foo
end
Run Code Online (Sandbox Code Playgroud)
如果我对foo方法进行了一些更改,我必须重新启动worker才能反映更改.在开发模式中,这可能变得非常烦人.
我试图找到一种方法来为每个请求重新加载有效载荷类(在本例中为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
Run Code Online (Sandbox Code Playgroud)
这种方法不起作用,因为使用的类require_dependency需要在调用之前重新加载,我还没有想出如何做到这一点.我花了一些时间阅读调度程序代码,以弄清楚Rails如何为每个请求重新加载类.我无法找到重新加载代码.
以前有人试过这个吗?你怎么建议我继续?或者你有任何指针来查找Rails类重载代码?
Har*_*tty 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2311 次 |
| 最近记录: |