我有一个应用程序已经运行了很长时间。我正在打开线程安全!,现在延迟作业不起作用,说它找不到我的模型文件之一。
作业加载失败:未定义的类/模块 Foo
这不是我在 /lib 中定义的自定义作业类,这是 app/models 中的模型文件
什么可能导致此类无法加载?
我有一个应用程序已经运行了很长时间。我正在打开线程安全!,现在延迟作业不起作用,说它找不到我的模型文件之一。
作业加载失败:未定义的类/模块 Foo
这不是我在 /lib 中定义的自定义作业类,这是 app/models 中的模型文件
什么可能导致此类无法加载?
正如您记录的问题上所发布的那样,以防其他人首先找到此 SO 帖子:
我也遇到了这个问题......这就是我发现的:如果应用程序是通过 rake 任务加载的,Rails 不会急切加载类(这就是 DJ 的工作方式)。
所以我所做的是我的这段代码production.rb
:
# Enable threaded mode, unless a rake task (likely Delayed Job) is running:
config.threadsafe! unless defined?($rails_rake_task) && $rails_rake_task
Rails 在 rake 任务加载时设置该全局变量。丑陋,但现在似乎对我来说很好......当然,如果您有多线程的 rake 任务,那么这并不理想,您可能应该调用 Rails.application.eager_load!对于那些任务。不过,我猜多线程 rake 任务很少见。
即使在使用pat不使用 threadsafe 进行 rake 作业的方法之后,我的作业仍然失败。
我最终不得不使用GitHub Wiki 页面上的以下手动加载技术:
# file: config/initializers/custom.rb
require 'my_custom_class'
不是真的相关,但我今天有完全相同的错误消息与延迟作业,没有启用线程安全。
原因和解决方案要简单得多——我们的服务器上有另一个 ruby 产品使用延迟作业,它的工作人员没有命名队列,所以他们从我设置的队列中抓取随机作业。