使用线程安全时,模型类未在延迟作业中加载

时间:2012-09-20 18:19:15

标签: ruby-on-rails delayed-job

我的应用程序已经运行了很长时间。我正在开启线程安全!,现在延迟工作无效,说它找不到我的模型文件。

Job failed to load: undefined class/module Foo

这不是我在/ lib中定义的自定义作业类,这是app / models中的模型文件

可能导致此类无法加载的原因是什么?

3 个答案:

答案 0 :(得分:12)

在您记录的问题上发布,以防其他人首先发现此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任务很少见。

答案 1 :(得分:3)

即使使用 pat 的方法不使用线程安全的rake作业,我的工作仍然失败。

我最终不得不使用GitHub Wiki page上的以下手动加载技术:

# file: config/initializers/custom.rb
require 'my_custom_class'

答案 2 :(得分:0)

并没有真正相关,但我今天有完全相同的错误消息,延迟作业,没有启用线程安全。

原因和解决方案更加微不足道 - 我们的服务器上有另一个使用延迟作业的ruby产品,并且它的工作人员没有命名队列,因此他们从我正在设置的队列中抓取随机作业。