【问题标题】:Undefined Method Error when creating delayed_job workers with script/delay_job使用 script/delay_job 创建delayed_job 工作者时出现未定义的方法错误
【发布时间】:2011-10-09 15:13:26
【问题描述】:

在运行多个工作器时遇到了一些问题。

当使用rake jobs:work 创建工作人员时,即使多次调用它,作业运行也没有问题,但是当使用ruby script/delayed_job -n 5 start all 工作创建工作人员时,由于Syck::DomainType 上的未定义方法而失败。

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

  • 耙 0.9.2
  • 导轨 3.0.6
  • 延迟作业 2.1.4
  • delayedjob_mongoid 1.0.2

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

【问题讨论】:

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


    【解决方案1】:

    也许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 error, couldn't parse YAML

    【讨论】:

    • 行为没有变化。添加那些。以前已将 syck 设置为我的 yamler,因此唯一添加的是 require 'yaml' 行。同样的错误
    【解决方案2】:

    看起来问题源于 bundler >= 1.0.10 加载 psych 并在存在 libyaml 的情况下覆盖某些 sycks 功能。我能够从我的系统中删除 libyaml 安装,我知道这对每个人来说都是不可能的。很难追查,希望这篇文章对其他人有所帮助

    【讨论】:

      【解决方案3】:

      我遇到了完全相同的问题。我可以通过在控制台中加载作业并尝试反序列化来重现它:

      $ 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 托管环境为我解决了这个问题。

      【讨论】:

        【解决方案4】:

        运行它:

        bundle exec ./script/delayed_job -n 5 start
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-18
          • 2017-08-23
          • 1970-01-01
          相关资源
          最近更新 更多