1

我从 ActiveResource 收到一个非常奇怪的错误。我有一种方法可以调用另一个系统来获取产品列表。该列表相当大,生成和传输大约需要 3 分钟。因为这实际上只是一天一次的事情,所以我构建了一个 rake 任务来运行它。在生产中,每当我运行 rake 任务时,它都会失败并出现 500 错误。这是一些示例输出

$ time RAILS_ENV=production rake api:sync
rake aborted!
Failed with 500 Internal Server Error

(See full trace by running task with --trace)

real    2m1.753s
user    0m1.188s
sys 0m0.188s

然后我尝试使用脚本运行器:

$ RAILS_ENV=production script/runner 'Product.synchronize!(ProductManager::Product.find_valid_products)'
/var/www/apps/api/releases/20091202203413/vendor/rails/railties/lib/commands/runner.rb:48: Failed with 500 Internal Server Error (ActiveResource::ServerError)
    from /usr/local/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill'
    from /usr/local/lib/ruby/1.8/timeout.rb:62:in `timeout'
    from /usr/local/lib/ruby/1.8/timeout.rb:93:in `timeout'
    from /usr/local/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
    from /usr/local/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
    from /usr/local/lib/ruby/1.8/net/protocol.rb:126:in `readline'
    from /usr/local/lib/ruby/1.8/net/http.rb:2020:in `read_status_line'
    from /usr/local/lib/ruby/1.8/net/http.rb:2009:in `read_new'
     ... 17 levels...
    from /var/www/apps/api/releases/20091202203413/vendor/rails/railties/lib/commands/runner.rb:48
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from script/runner:3

但是,如果我跳入控制台运行它,一切都很好:

$ script/console production
Loading production environment (Rails 2.3.5)
>> Product.synchronize!(ProductManager::Product.find_valid_products); nil # prevent dump to console
=> nil
>> 

我怀疑这是超时,所以我在 ProductManager::Product 类上将超时值设置为 5 分钟,但这没有任何效果。有趣的是,当我通过 rake 或脚本/运行程序运行时,错误发生在 2 分 1 秒内,没有失败。在开发和分期中没有问题。ActiveResource 的生产是否有某种我找不到的隐藏的 2 分钟覆盖?

如果您没有从跟踪中得到它,我们正在使用冻结到应用程序中的 Rails 2.3.5。谢谢你的帮助

同行

4

1 回答 1

0

原来这是一个 Apache 设置。httpd.conf 文件中的 RequestTimeout 为 120 秒。一旦我们发现一切都很好。

于 2010-12-11T01:31:16.947 回答