1

我正在使用 Rails 3.2.12 运行延迟作业 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

还有什么可能导致错误?

4

3 回答 3

0

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

require 'rubygems'
require 'yaml'
YAML::ENGINE.yamler = 'syck'
于 2013-04-09T02:58:02.177 回答
0

以防万一有人遇到这个问题。我发现原因是一些工作注入了旧版本的延迟工作。因此,当较新的延迟作业尝试处理它们时,它无法反序列化处理程序。

于 2013-04-11T12:53:30.907 回答
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.

于 2016-04-08T17:40:30.267 回答