3

升级到 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 方法。

4

2 回答 2

2

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

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

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

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

该错误可能是在 Rails 4.2 升级之前和在config.active_job.queue_adapter = :delayed_jobapplication.rb 中设置之前排队/创建作业的结果。如果配置没有正确设置,那么作业将以 Rails 4.2 无法处理的格式序列化。要运行任何有fetch_value错误的作业,您可以切换到仍然在 > Rails 4.2 上的代码分支并从 rails 控制台运行作业。

于 2015-04-29T17:41:59.247 回答
0

您可以尝试将 delay_job 更新到较新的版本,rails 4/4.2/4.4 支持进行了一系列更改,看看它是否会影响您的应用程序。

对于 rails 4.2,他们希望config.active_job.queue_adapter = :delayed_job在 config/application.rb 中设置

于 2015-02-26T21:46:27.287 回答