2009-06-11 7 views
1

J'ai des problèmes avec les délais d'attente qui ne fonctionnent pas de manière fiable avec JRuby (Linux). Plus précisément, si j'envoie une requête HEAD à un serveur distant et que ce serveur est occupé (ne répond pas), le délai d'attente configuré ne se déclenche pas et mon application reste bloquée pendant une longue période. J'ai essayé à la fois, la mise en read_timeout et en utilisant la fonction timeout() mais aucun travaillé de manière fiable:Délai d'attente JRuby fiable pour les requêtes HTTP

Timeout::timeout(5) do 
    Net::HTTP.start(uri.host, uri.port) do |http| 
    http.read_timeout = 5 
    http.request_head(uri.request_uri) 
    end 
end 

Pour Ruby ce problème est le document largement à la page SystemTimer. Cependant, la gemme SystemTimer proposée ne peut pas être utilisée avec JRuby.

Quelqu'un a-t-il une idée sur la façon d'obtenir des délais d'attente fiables pour les demandes HTTP dans JRuby?

PS: Ceci est JRuby 1.1.6/Linux 32 bits/Sun Java 1.6

Répondre

2

Ce problème a été spécifiquement ciblé et traitées au cours des dernières versions de JRuby. En particulier, JRuby a été corrigé pour permettre à timeout.rb de fonctionner avec des E/S bloquantes. Vous voulez être sur 1.3. JRuby 1.1.6 est assez vieux et a un certain nombre de problèmes qui ont été résolus depuis.

+0

Merci pour votre réponse. Cela résout le problème bien que j'aie été réticent à mettre à niveau à cause de beaucoup d'avertissements liés à openssl (apparemment inoffensifs) et d'un problème d'encodage de caractères méchant avec Hpricot: http://jira.codehaus.org/browse/JRUBY-3732 – Pankrat

0

Ce bug est toujours là dans JRuby ver 1.5.5 au moins lorsqu'il s'agit d'une connexion socket ..