我正在延迟工作.当我调用foo方法时,工作人员打印出你好.
class User def foo puts "Hello" end handle_asynchronously :foo end
如果我对foo方法进行了一些更改,我必须重新启动这个工作来进行更改以反映出来.在开发模式下,这可能变得相当麻烦.
我正在尝试为每个请求找到一种重新加载有效负载类(在这种情况下是用户类)的方法.我试图在补丁方法调用之前,修补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类的重载代码?
解决方法
我设法找到一个解决方案.我使用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