在我们的 Rails 应用程序中。我们保存一个模型(视频)。我们对该对象有一个回调:
after_create :send_to_background_job, :if => :persisted?
该方法如下所示:
def send_to_background_job
Resque.enqueue(AddVideo, self.id)
end
当工人被调用时。它执行以下操作:
class AddVideo
@queue = :high
def self.perform(video_id)
video = Video.find(video_id)
video.original_file_name
....
Resque-web 报错:
AddVideo
Arguments
51061
Exception
NoMethodError
Error
undefined method `original_filename' for nil:NilClass
这有点奇怪,因为如果我去 Rails 控制台寻找这个视频。它确实存在。此外,调用Resque.enqueue(AddVideo, 51061)
第二次,运行没有任何错误。
就好像将记录保存在数据库中所需的时间比创建工人/作业所需的时间要长。但是即使这个语句也没有加起来,因为对象只有在对象被保存后才会调用 Resque 作业。在 Rails 中,这是通过模型 ( after_create
) 中的回调方法完成的。
不知道这是否在问题中起作用。在初始化文件中,我有:
Resque.before_fork do
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
Resque.after_fork do
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end