有时Resque“卸载”Rails环境是没有明显原因的

时间:2011-12-06 16:31:04

标签: ruby-on-rails ruby require resque worker

我有一个使用Ruby on Rails和resque的简单堆栈。我以正常的方式排队工作,我有一群工人表演。没什么了不起的。

我的问题是,如果我让工作人员长时间运行,他们就会停止对应用程序模型的可见性,并且对这种方法的每次调用都会产生undefined_method

这非常奇怪,因为它可以完美地工作几天然后突然开始失败。重新启动工作程序可以解决问题,但通常会在一段时间后恢复。

我不知道会发生什么,所以任何指针都会非常感激。

1 个答案:

答案 0 :(得分:2)

Resque worker派遣新流程来完成工作。您可能没有在分叉子进程中加载​​模型的类。由于加载类的顺序,也可能存在命名空间冲突。

如果您在开发过程中更改类文件而不重新启动resque worker,我怀疑它没有正确地重新加载您的类。

要确保在fork之前加载类,请引用resque setup任务中的类。在fork之前加载的类将被复制到子进程。下面,我将它们放在一个数组中以强制它们加载。这也更快,因为每个子进程已经加载了类。如果您正在使用AR,还应该在after_fork块中重新建立ActiveRecord连接。

<强> LIB /任务/ resque.rake:

namespace :resque do
  task :setup => :environment do
    [User, Monkey, Banana] # force these classes to load

    Resque.after_fork { ActiveRecord::Base.establish_connection }
  end
end