簡體   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