【问题标题】:Why can't my resque job find the object?为什么我的 resque 工作找不到对象?
【发布时间】:2013-02-27 23:23:25
【问题描述】:

在我们的 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

【问题讨论】:

    标签: ruby-on-rails postgresql redis resque


    【解决方案1】:

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

    你应该把 after_create 切换到

    after_commit :send_to_background_job, on: :create
    

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多