2009-12-03 10 views
1

Je reçois une erreur vraiment étrange d'ActiveResource. J'ai une méthode qui appelle un autre système pour obtenir une liste de produits. La liste est assez grande et prend environ 3 minutes pour générer et transférer. Puisque ce n'est vraiment qu'une fois par jour, j'ai construit une tâche de rake pour l'exécuter. En production chaque fois que j'exécute la tâche rake, il échoue avec une erreur de 500. Voici quelques exemple de sortieErreur de serveur interne ActiveResource 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 

J'ai ensuite essayé d'utiliser coureur de script:

$ 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 

Cependant, si je saute dans la console pour l'exécuter, tout va bien:

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

I Je soupçonnais qu'il s'agissait d'un délai d'expiration, donc j'ai défini la valeur du délai d'expiration à 5 minutes sur la classe ProductManager :: Product, mais cela n'a eu aucun effet. La chose intéressante est que lorsque je cours par rake ou script/runner l'erreur se produit à 2 minutes et 1 seconde sans échec. Dans le développement et la mise en scène, il n'y a pas de problème. La production d'ActiveResource a-t-elle une sorte de dérogation cachée de 2 minutes que je ne trouve pas? Si vous ne l'avez pas obtenu à partir des traces, nous utilisons des Rails 2.3.5 figés dans l'application. Merci pour votre aide

Peer

+0

AFAIK il n'y a rien de 2 minutes dans la ressource active. Même si le client HTTP a peut-être son propre délai d'expiration. –

+0

OOC - lorsque vous l'exécutez dans la console. Combien de temps cela prend-il? c.-à-d. ça prend> 2min, ou ça marche vraiment vite (parce que vous avez déjà synchronisé)? –

Répondre

0

Transforme que c'était un cadre Apache. Le RequestTimeout dans le fichier httpd.conf était de 120 secondes. Une fois que nous avons augmenté que tout allait bien. APRÈS: