2

我有一个带有 Ruby on Rails 和resque的简单堆栈。我以正常方式排队工作,并且有一群工人在执行。没什么疯狂的。

我的问题是,如果我让工作人员运行足够长的时间,他们将停止查看应用程序的模型,并且每次调用此类方法都会导致undefined_method.

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

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

4

1 回答 1

2

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

如果您在没有重新启动 resque 工作人员的情况下更改开发中的类文件,我怀疑它没有正确重新加载您的类。

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

lib/tasks/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
于 2011-12-19T17:55:29.177 回答