无法弄清楚Delayed :: DeserializationError

我正在使用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 

还有什么可能导致错误?

我想当我们升级到rails 3.2时我也遇到过这个问题。 我得到的错误是由延迟作业使用的yaml处理程序引起的。 尝试将以下内容添加到config/boot.rb

 require 'rubygems' require 'yaml' YAML::ENGINE.yamler = 'syck' 

以防任何人遇到这个问题。 我想出原因是一些工作被注入了旧版本的延迟工作。 因此,当较新的Delayed Job尝试处理它们时,它无法反序列化处理程序。

这是由于升级到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