2011-12-06 55 views
2

我有一个Ruby on Rails和resque的简单堆栈。我以正常的方式让工作排队,我有一群工作人员在表演。没有疯狂。有时Resque“卸载”Rails环境没有明显的原因

我的问题是,如果我让工作人员长时间运行,他们会停下来看清应用程序的模型,每次调用这种方法都会导致undefined_method

这很奇怪,因为它可能会完美工作几天,然后突然开始失败。重新启动工作人员可以解决问题,但通常会在一段时间后回来。

我不知道会发生什么,所以任何指针将不胜感激。

+0

你在那个时候做一些版本?是capistrano删除resque正在工作的文件或类似的东西? – phoet

+0

@phoet它正在发展中。我还没有生产环境。我可能会更改文件,但一旦它们由工作人员加载,它应该很重要 - 我认为 – marcgg

+0

您可以发布堆栈跟踪,了解失败过程中发生的情况吗? 对我来说,就像你的工作人员已经失去了与数据库的连接,而不是应用程序代码变得非常糟糕。但我不是Rails/Activerecord用户,所以我不确定。 –

回答

2

Resque工人分叉新工艺来完成这项工作。您的模型的类可能没有加载到分叉的子进程中。由于加载类的顺序,也可能存在命名空间冲突。

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

要确保您的类在fork前加载,请参考resque setup任务中的类。加载前叉的类将被复制到子进程。下面,我把它们放在一个数组中以强制它们加载。这也更快,因为每个子进程已经加载了类。如果你使用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 
+0

这正是发生了什么事,谢谢 – marcgg

+0

为什么我们应该在after_fork中重新建立AR连接? –

相关问题