升级到 Rails 4.2 中断 Delayed::Job:作业加载失败:未定义的方法 'fetch_value'

Upgrading to Rails 4.2 breaks Delayed::Job: Job failed to load: undefined method 'fetch_value'

升级到 Rails 4.2,本地一切正常,推送到生产环境 'kaboom'。每个 Delayed::Job 都因同样的错误而失败。

Job failed to load: undefined method 'fetch_value' for #. Handler: " --- YAMLYAMLYAMLYAML "

我们收到的错误消息来自下面的函数,它调用不同的库,捕获实际错误,并返回它们自己的错误,这使得调试非常困难。

  def payload_object
    @payload_object ||= YAML.load_dj(handler)
  rescue TypeError, LoadError, NameError, ArgumentError, SyntaxError, Psych::SyntaxError => e
    raise DeserializationError, "Job failed to load: #{e.message}. Handler: #{handler.inspect}"
  end

其他可能有用的东西,我们只使用 Delayed::Job(不使用 Active::Job)。

fetch_value 从未在 delayed_job 中调用,它是一个 Active::Record 方法。

您可以尝试将 delayed_job 更新到较新的版本,changes 有一系列 rails 4/4.2/4.4 支持,看看它是否会影响您的使用应用

而对于 rails 4.2,他们 expect 你在 config/application.rb

中设置了 config.active_job.queue_adapter = :delayed_job

我在将应用程序升级到 Rails 4.2.1 时遇到了类似的 fetch_value 错误。要更深入地了解该错误,请在 rails 控制台中获取任何有此错误的作业和 运行 以下内容:

YAML.load_dj(Delayed::Job.find(JOB_ID).handler)

它 运行 是内部延迟的作业代码,但应该可以为您提供更好的调试跟踪。

来源:https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/backend/base.rb#L90

该错误可能是 queueing/creating 作业在 Rails 4.2 升级之前和在您的 application.rb 中设置 config.active_job.queue_adapter = :delayed_job 之前的结果。如果配置设置不正确,那么作业将以 Rails 4.2 无法处理的格式序列化。对于 运行 任何出现 fetch_value 错误的作业,您可以切换到仍在 > Rails 4.2 和 运行 来自 rails 的作业的代码分支安慰。