Chr*_*ini 5 postgresql ruby-on-rails resque redis
在我们的Rails应用程序中.我们保存模型(视频).我们在该对象上有一个回调:
after_create :send_to_background_job, :if => :persisted?
Run Code Online (Sandbox Code Playgroud)
该方法如下:
def send_to_background_job
Resque.enqueue(AddVideo, self.id)
end
Run Code Online (Sandbox Code Playgroud)
当工人被召唤时.它执行以下操作:
class AddVideo
@queue = :high
def self.perform(video_id)
video = Video.find(video_id)
video.original_file_name
....
Run Code Online (Sandbox Code Playgroud)
Resque-web报告错误:
AddVideo
Arguments
51061
Exception
NoMethodError
Error
undefined method `original_filename' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为,如果我去Rails控制台寻找这个视频.它确实存在.此外,调用Resque.enqueue(AddVideo, 51061)SECOND时,运行没有任何错误.
就好像在数据库中保存记录所花费的时间要多于创建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
Run Code Online (Sandbox Code Playgroud)
这可能是因为保存对象的实际事务尚未提交,后台作业已经开始处理它.
您应该将after_create切换为
after_commit :send_to_background_job, on: :create
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
914 次 |
| 最近记录: |