2013-08-12 12 views
31

Jaka jest różnica między trzema (oznaczone jako komentarze):Jaka jest różnica między setConnectionTimeout, setSoTimeout i "http.connection-manager.timeout" w apache httpclient API

MultiThreadedHttpConnectionManager connManag = new MultiThreadedHttpConnectionManager(); 
HttpConnectionManagerParams managParams = connManag.getParams(); 

managParams.setConnectionTimeout(connectiontimeout); // 1 
managParams.setSoTimeout(sotimeout); //2 

HttpMethodBase baseMethod = null; 

try { 
    HttpClient client = new HttpClient(connManag); 
    client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3 

    baseMethod = new GetMethod(…); 
    int statusCode = client.executeMethod(…); 

    … 
} 
catch (ConnectTimeoutException cte){ 
    //Took too long to connect to remote host 
} 
catch (SocketTimeoutException ste){ 
    //Remote host didn’t respond in time 
} 
catch (Exception se){ 
    //Some other error occurred 
} 
finally { 
    if (baseMethod != null) 
    baseMethod.releaseConnection(); 
} 

1. setConnectionTimeout - jeśli określa limit czasu do momentu ustanowienia połączenia.

2. setSoTimeout - jeśli stwierdzi okres bezczynności lub różnicy czasu między dwoma kolejnymi pakietami,

To co robi poniżej jednego zrobić:

3. "http.connection-manager.timeout"

+0

Co mówią doktorzy? Czy oni milczą? –

+0

@Marko Nie jestem w stanie tego zrozumieć, dlatego zamieszczono tutaj – Prateek

+0

Powinieneś przynajmniej wspomnieć, że je przeczytałeś i wskazać konkretne aspekty, które Cię niepokoją. W ten sposób Twoje pytanie wygląda tak, jakbyś po prostu prosił nas, abyśmy przeczytali Ci dokumenty. –

Odpowiedz

50

na najniższym poziomie HTTP jest gniazdo TCP . Kiedy więc poprosisz o adres URL i uzyskasz odpowiedź, na niższym poziomie tworzony jest klucz klienta, który ustanawia połączenie ze zdalnym gniazdem serwera, wysyła pewne dane i otrzymuje odpowiedź.

  • setConnectionTimeout: Klient próbuje połączyć się z serwerem. To oznacza czas, jaki upłynął do nawiązania połączenia lub Serwer odpowiedział na żądanie połączenia.

  • setSoTimeout: Po nawiązaniu połączenia gniazdo klienta czeka na odpowiedź po wysłaniu żądania. Jest to czas, jaki upłynął od momentu wysłania przez klienta żądania do serwera, zanim serwer odpowie. Należy pamiętać, że to nie jest to samo, co HTTP Error 408, które serwer wysyła do klienta. Innymi słowy, ustalono maksymalną długość okresu nieaktywności pomiędzy dwoma kolejnymi pakietami danych docierającymi do klienta po połączeniu.

  • http.connection-manager.timeout: MultiThreadedHttpConnectionManager używa pulę połączeń HTTP. Ma maksymalne i minimalne wartości na zestaw hosta dla niego. Jeśli wszystkie połączenia dla określonego hosta osiągną maksymalną wartość, żądanie nowego połączenia dla tego samego hosta będzie musiało poczekać, aż dowolne istniejące połączenie stanie się wolne. Ten parametr określa czas, który upłynął, kiedy zostało wysłane żądanie połączenia, i zanim HttpConnectionManager zwrócił połączenie.

+0

oznacza to, że musimy zamknąć jedno z gniazd lub połączeń – Prateek

+0

Gdy zajmiemy się interfejsami API, takimi jak 'HttpClient', nie musimy bezpośrednio zajmować się gniazdami. Nawet w przypadku 'HttpClient' istnieje metoda (' httpclient.getConnectionManager(). Shutdown(); ') w celu wyłączenia samego' HttpClient', który wykonuje zamknięcie połączeń. – Santosh

+0

, ale nie muszę zamykać połączeń, ponieważ robię połączenie z siecią. Co powinienem zrobić, aby przestać czekać na odpowiedź na żądanie. – Prateek

5

Szczegółowe wyjaśnienie znajduje się w Connection management documentation na stronie klienta Apache HTTP.

CoreConnectionPNames.SO_TIMEOUT = „http.socket.timeout” określa czas oczekiwania gniazdo (SO_TIMEOUT), w milisekundach, który jest limit czasu oczekiwania dla danych lub, inaczej mówiąc, maksymalny bezczynność okres pomiędzy dwoma kolejnymi pakiety danych). Wartość zerowa zera jest interpretowana jako nieskończony czas oczekiwania. Ten parametr oczekuje wartości typu java.lang.Integer. Jeśli ten parametr nie zostanie ustawiony, operacje odczytu nie przekroczą limitu czasu (nieskończony czas oczekiwania).

CoreConnectionPNames.CONNECTION_TIMEOUT = "http.connection.timeout": określa limit czasu w milisekundach do momentu ustanowienia połączenia. Wartość zerowa zera jest interpretowana jako nieskończony czas oczekiwania. Ten parametr oczekuje wartości typu java.lang.Integer. Jeśli ten parametr nie zostanie ustawiony, operacje łączenia nie przekroczą limitu czasu (nieskończony czas oczekiwania).

Timeout Connection Manager (http.connection-manager.timeout) - czas oczekiwania na połączenie z menedżer połączeń/basen

Tylko dla rekordu

HttpParams httpParams = httpClient.getParams(); 
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000); 
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000); 

jest alternatywny sposób zrobić

HttpParams httpParams = httpClient.getParams(); 
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000); 
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000); 

(More details here)

0

W prostych słowach: Time Out

  • połączenie: limit czasu aplikacja czeka podczas próby nawiązania połączenia z serwerem i nie jest w stanie (adres jest nieprawidłowy, lub serwer jest wyłączony itd.)
  • Limit czasu oczekiwania: czas oczekiwania aplikacji na połączenie z serwerem, ale wciąż czeka na odpowiedź (opóźnienie może być spowodowane na przykład przez zawieszenie serwera)
  • Połączenie timeout menedżera: limit czasu, na jaki żądanie czeka, kiedy znajduje się w kolejce oczekującej na jedno z żądań wt uwolnić pulę. Innymi słowy, w HTTP mamy pulę połączeń o maksymalnym rozmiarze. Gdy jest obciążenie aplikacji, pula może być pełna, a każde nowe żądanie musi czekać na zakończenie kolejnej prośby z puli.
0

Ten diagram sekwencji może pomóc.

sequence diagram for timeouts

Powiązane problemy