我正在使用Rails 3.2.12运行delayed_job 3.0.5(delayed_job_active_record 0.4.1)。由于“反序列化”,我的一些工作失败了。以下是其中一个失败处理程序的一个非常简单的示例:
--- !ruby/struct:Delayed::PerformableMethod
object: LOAD;Project;924951
method: :send_project_open_close_without_delay
args: []
当我尝试调用此作业时:
Delayed::DeserializationError: Job failed to load: undefined method `members' for nil:NilClass.
每个人似乎都认为这是由不再存在的AR对象引起的。就我而言,我可以正常运行处理程序:
Project.find(924951).send_open_close_without_delay
还有什么可能导致错误?
答案 0 :(得分:0)
我认为在升级到rails 3.2时我也遇到过这个问题。我得到的错误是由延迟作业使用的yaml处理程序引起的。尝试将以下内容添加到config/boot.rb
require 'rubygems'
require 'yaml'
YAML::ENGINE.yamler = 'syck'
答案 1 :(得分:0)
万一有人遇到过这个问题。我想出原因是一些工作被注入了旧版的延迟工作。因此,当较新的Delayed Job尝试处理它们时,它无法反序列化处理程序。
答案 2 :(得分:0)
这是由于升级到Delayed::Job
而导致更改了序列化处理程序并更改了用于PerformableMethod
的对象类型。如果要修复所有旧作业并坚持使用Delayed :: Job的新默认值,可以使用此查询修复失败的作业:
Delayed::Job.where('failed_at is not null').each do |dj|
dj.handler = dj.handler.gsub('struct:Delayed', 'object:Delayed')
Delayed::Worker.new.run(dj)
end
此处发生了变化:https://github.com/collectiveidea/delayed_job/commit/7b8a79a72c0ee5d8bac4bc0b183d1cce9cedff85
使PerformableMethod
成为一个班级,而不是Struct
。