繁体   English   中英

为什么我的resque工作找不到对象?

[英]Why can't my resque job find the object?

在我们的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)时,运行时没有任何错误。

就好像在数据库中保存记录所花费的时间要多于创建worker / job所需的时间。 但即使这个语句也没有加起来,因为只有在保存对象后,对象才会调用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

这可能是因为保存对象的实际事务尚未提交,后台作业已经开始处理它。

您应该将after_create切换为

after_commit :send_to_background_job, on: :create

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM