我有一个使用Ruby on Rails和resque的简单堆栈。我以正常的方式排队工作,我有一群工人表演。没什么了不起的。
我的问题是,如果我让工作人员长时间运行,他们就会停止对应用程序模型的可见性,并且对这种方法的每次调用都会产生undefined_method
。
这非常奇怪,因为它可以完美地工作几天然后突然开始失败。重新启动工作程序可以解决问题,但通常会在一段时间后恢复。
我不知道会发生什么,所以任何指针都会非常感激。
答案 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