我最近把delayed_job带到了我的Rails 3.1.3应用程序中。开发中 一切都好。我甚至将我的DJ发布在与我相同的VPS上 生产应用程序使用相同的生产应用程序服务器(Thin), 一切都很好。然而,一旦我发布到生产,所有 地狱破裂:没有任何工作进入工作表 正确地说,我开始在所有日志中看到以下内容 已完成的工作:
2012-02-18T14:41:51-0600: [Worker(delayed_job host:hope pid:12965)]
NilClass# completed after 0.0151
2012-02-18T14:41:51-0600: [Worker(delayed_job host:hope pid:12965)] 1
jobs processed at 15.9666 j/s, 0 failed ...
NilClass并没有方法名称?当然不正确。所以我看了看 数据库中作业的序列化处理程序并看到:
"--- !ruby/object:Delayed::PerformableMethod\nattributes:\n id: 13\n
event_id: 26\n name: memememe\n api_key: !!null \n"
没有类或方法名称的指示。当我加载YAML时 一个对象,并在我得到的PerformableMethod上调用#object 零。为了踢,我然后在破碎的生产上启动控制台 应用程序和推迟相同的工作。这次处理程序看起来像:
"--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/
ActiveRecord:Domain\n attributes:\n id: 13\n event_id: 26\n
name: memememe\n api_key: !!null \nmethod_name: :create_a\nargs: []
\n"
果然,这份工作运行良好。困惑,我接着回忆起读书 一些关于DJ不能与Thin玩得很好的东西。所以,我试过Unicorn和 很遗憾的看到了同样的结果。我想以后的研究时间 这与应用服务器如何加载YAML有关 图书馆Psych和Syck以及DJ与他们的互动。我不能, 然而,确切地说明了什么是错的。
请注意,我正在运行delayed_job 3.0.1官方,但已尝试升级到 主分支甚至尝试降级到2.1.4。 以下是我的舞台和制作之间的一些显着差异 设置:
网络代理/ Nginx可以与它有关吗?拜托,非常感谢任何见解。我花了很多时间 整合delayed_job并且不愿意搁置工作,或者更糟糕的是, 扔了它。谢谢你的阅读。
答案 0 :(得分:1)
我通过不使用#delay来解决这个问题。相反,我用自定义作业替换了所有“model.delay.method”代码。这样做就像一个魅力,最终更灵活。此修复程序适用于Thin。我没有用Unicorn测试过。
答案 1 :(得分:0)
我遇到了与rails 3.0.10和dj 2.1.4类似的问题,当从控制台vs从app服务器运行时,它肯定是一个不同的yaml库。瘦,独角兽,nginx。我将分享我提出的任何解决方案
好的,所以从config / boot.rb中删除这些行为我解决了这个问题。
require 'yaml'
YAML::ENGINE.yamler = 'syck'
这是为了修复YAML解析错误,强制YAML使用'syck'。删除它需要我修复.yml文件的潜在问题。有关此here
的更多信息现在,我的延迟作业记录处理程序在通过服务器(在我的情况下是独角兽)和控制台创建的那些之间匹配。我的服务器和延迟的工作人员都在捆绑器中启动
独角兽
cd #{rails_root} && bundle exec unicorn_rails -c #{rails_root}/config/unicorn.rb -E #{rails_env} -D"
DJ
export LANG=en_US.utf8; export GEM_HOME=/data/reception/current/vendor/bundle/ruby/1.9.1; cd #{rail
s_root}; /usr/bin/ruby1.9.1 / data / reception / current / script / delayed_job start staging