Ruby on rails 延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类
我在管理一个迟到的工作人员。每当我调用Ruby on rails 延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类,ruby-on-rails,delayed-job,Ruby On Rails,Delayed Job,我在管理一个迟到的工作人员。每当我调用foo方法时,worker都会打印hello class User def foo puts "Hello" end handle_asynchronously :foo end 如果我对foo方法进行了一些更改,我必须重新启动worker以反映更改。在开发模式中,这可能会变得非常烦人 我试图找到一种方法为每个请求重新加载有效负载类(在本例中为用户类)。在有效负载方法调用之前,我尝试通过monkey修补DelayedJob库来调用req
foo
方法时,worker都会打印hello
class User
def foo
puts "Hello"
end
handle_asynchronously :foo
end
如果我对foo
方法进行了一些更改,我必须重新启动worker以反映更改。在开发模式中,这可能会变得非常烦人
我试图找到一种方法为每个请求重新加载有效负载类(在本例中为用户类)。在有效负载方法调用之前,我尝试通过monkey修补DelayedJob库来调用require\u 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\u dependency
注册的类需要在调用之前重新加载,而我还没有弄明白怎么做。我花了一些时间阅读dispatcher代码,以了解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
这看起来像是在没有alias_方法hackery的情况下解决了您的问题:
从4.0.6版开始,如果Rails.application.config.cache\u classes
设置为false
,则DelayedJob会自动重新加载:
在开发模式下,如果您使用的是Rails 3.1+,则应用程序代码将每隔100个作业或队列结束时自动重新加载。您不再需要在每次更新开发中的代码时重新启动延迟的作业
非常感谢。这非常有效,即使使用mongoid作为后端。我只需要删除第一行就可以了:)太好了!is做了一些类似的事情,但作为一个应用程序,并将其与之结合使用,我真的不明白为什么,但这会导致我的Rails内存在所有环境(包括生产环境)和非DJ实例中膨胀。