使用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