[英]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.