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

时间:2015-02-19 21:26:43

标签: ruby-on-rails delayed-job ruby-on-rails-4.2

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

永远不会在delayed_job中调用fetch_value,它是一个Active :: Record方法。

2 个答案:

答案 0 :(得分:2)

当我将应用程序升级到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

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

答案 1 :(得分:0)

您可以尝试将delayed_job更新为更新的版本,有一系列changes用于rails 4 / 4.2 / 4.4支持,并查看它是否会在您的应用中制作内容。

对于rails 4.2他们expect你在config / application.rb中设置了config.active_job.queue_adapter = :delayed_job