延迟作业:如何在开发模式下的每次调用期间重新加载有效负载类

我正在经营一名工作延迟的工人。 当我调用foo方法时,worker打印hello

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

如果我对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 

这种方法不起作用,因为需要在调用之前重新加载使用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 

从版本4.0.6开始,如果Rails.application.config.cache_classes设置为falseRails.application.config.cache_classes会自动重新加载:

在开发模式下,如果您使用的是Rails 3.1+,您的应用程序代码将自动重新加载每100个作业或队列完成时。 每次更新开发代码时,都不再需要重新启动延迟作业。

这看起来像没有alias_method hackery解决了你的问题:

https://github.com/Viximo/delayed_job-rails_reloader