ActiveResourceから本当に奇妙なエラーが発生します。別のシステムを呼び出して製品のリストを取得するメソッドがあります。リストは非常に大きく、生成と転送に約3分かかります。これは実際には1日に1回だけなので、実行するための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またはscript / runnerを介して実行すると、エラーが2分1秒で必ず発生することです。開発とステージングでは問題はありません。ActiveResourceの制作には、私が見つけられないある種の隠された2分のオーバーライドがありますか?
トレースから取得できなかった場合は、アプリケーションにフリーズされたRails2.3.5を使用しています。助けてくれてありがとう
ピア