2012-04-04 20 views
5

Witam Używam gem HTTPClient i mam problem; Używam go do rejestracji użytkownika. Podczas uruchamiania nazwę użytkownika i hasło są wprowadzane do mojej bazy danych, ale czeka długa i wróć do mnieHTTPClient :: ReceiveTimeoutError w Ruby on Rails

HTTP Client::ReceiveTimeout Error in User Controller#signup execution expired. 

jak mogę rozwiązać mój problem?

Odpowiedz

5

Domyślam się, że twoje połączenie http lub połączenie zdalne nie jest stabilne. Ilekroć mam taką sytuację, używam limitu czasu i ponawiam próbę kilka razy. Poniższy kod wykona Twój kod przez 10 sekund, a jeśli nie zostanie ukończony, upłynie limit czasu i spróbuje ponownie. Jeśli ponowienie nie powiedzie się wiele razy, w końcu się nie powiedzie.

def timeout_and_retry 
    retries = 0 
    begin 
    Timeout::timeout(10) { yield } 
    rescue Timeout::Error 
    raise if (self.retries += 1) > 3 
    retry 
    end 
end 

timeout_and_retry do 
    # http client get code goes here 
end 
+0

Byłem używany Timeout :: timeout (10000) :) – yagmurdursun

+0

Piękny. Działa uroku, gdy limity czasowe w Exchanger na dużą skrzynkę odbiorczą. Dziękuję Ci. – avguchenko

11

Skorzystaj z błędu receive_timeout;

client = HTTPClient.new 
client.receive_timeout = 10000 # setting receivetimeout for HTTPClient! 
+4

można również ustawić "send_timeout = 0" i "receive_timeout = 0", aby nie przekroczyły limitu czasu. – tamersalama

0

Gdy kiedykolwiek dostaniesz http: ReceiveTimeOutError, oznacza to, że zapytanie zostało wysłane i miało to czeka na miejsce w określonym czasie, a ponieważ nie ma odpowiedzi w terminie, to wygasa, a otrzymasz ten błąd.

Zawsze określaj więcej czasu, aby dłużej czekać na odpowiedź.