使用script / delay_job创建delayed_job worker时出现未定义的方法错误

运行多个工作人员时遇到一些问题。

使用rake jobs:work创建rake jobs:work即使多次调用rake jobs:work作业也没有问题,但是当使用ruby script/delayed_job -n 5 start all创建工作程序时, ruby script/delayed_job -n 5 start all作业都会在Syck::DomainType上使用未定义的方法失败。

我搜索了很多,但似乎无法找到解决方案。 我在Mongoid后端运行DelayedJob。 gem版本:

  • 耙0.9.2
  • rails 3.0.6
  • 延迟工作2.1.4
  • delayedjob_mongoid 1.0.2

有没有人遇到过类似的错误/有解决方案? 或者缺少一些关于为什么/如何创建工人的信息取决于调用它们的方式?

我有同样的问题。 我可以通过在控制台中加载作业并尝试反序列化来重现它:

 $ rails console production > j = Delayed::Job.last > YAML.load(j.handler) 

在我的生产环境中,我得到了一个Syck :: DomainType对象,而在开发中它只是反序列化了我的对象(存储在db中的数据在两种情况下都是相同的)。

长话短说,我意识到我的服务器上有ruby 1.9.1而不是1.9.2。 使用ruby-1.9.2p290切换到rvm托管环境解决了我的问题。

也许ruby script/delayed_job -n 5 start all不会调用Bundler.setup ,这就是为什么它与其他启动worker的方式不同? (只是一个猜测)

您可以通过将它放在config/application.rb的顶部来修复Syck::DomainType错误

 require 'yaml' YAML::ENGINE.yamler = 'syck' # [...] require File.expand_path('../boot', __FILE__) 

多亏了这个答案: rails错误,无法解析YAML

看起来问题来自bundler> = 1.0.10加载心理并覆盖一些sycksfunction,如果存在libyaml。 我能够从我的系统中删除libyaml安装,我知道这对每个人都是不可能的。 很难追查,希望这篇文章能帮助别人

运行它:

 bundle exec ./script/delayed_job -n 5 start