2013-08-12 13 views
31

Qual è la differenza tra i tre (contrassegnata come commento):Qual è la differenza tra il setConnectionTimeout, setSoTimeout e "http.connection-manager.timeout" in 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 - se determina il timeout fino a quando non viene stabilita la connessione.

2. setSoTimeout - se determina il periodo di inattività o differenza di tempo tra due pacchetti consecutivi,

Allora cosa fa quella sottostante fare:

3. "http.connection-manager.timeout"

+0

Cosa dicono i documenti? Stanno zitti? –

+0

@ Marko Non è in grado di sottomettere questo perché pubblicato qui – Prateek

+0

Dovresti almeno menzionare che li hai letti e sottolineare aspetti particolari che ti turbano. In questo modo la tua domanda sembra che tu ci stia solo chiedendo di leggere i documenti per te. –

risposta

50

al minor HTTP livello è presa TCP . Pertanto, quando si richiede un URL e si ottiene una risposta, a livello inferiore viene creato un Socket client che stabilisce la connessione al Server Socket remoto, invia alcuni dati e riceve una risposta.

  • setConnectionTimeout: client tenta di connettersi al server. Questo indica il tempo trascorso prima della connessione stabilita o il server ha risposto alla richiesta di connessione.

  • setSoTimeout: Dopo aver stabilito la connessione, il socket client attende la risposta dopo l'invio della richiesta. Questo è il tempo trascorso poiché il client ha inviato una richiesta al server prima che il server risponda. Si noti che questo non è lo stesso HTTP Error 408 che il server invia al client. In altre parole, il suo periodo di inattività massimo tra tra due pacchetti di dati consecutivi che arrivano sul lato client dopo la connessione.

  • http.connection-manager.timeout: MultiThreadedHttpConnectionManager utilizza una pool di connessioni HTTP. Ha i valori massimi e minimi per host impostati per esso. Se tutte le connessioni per un particolare host hanno raggiunto il valore massimo, la richiesta di una nuova connessione per lo stesso host dovrà attendere fino a quando una qualsiasi della connessione esistente non sarà disponibile. Questo parametro indica il tempo trascorso quando è stata effettuata una richiesta di connessione e prima che HttpConnectionManager abbia restituito una connessione.

+0

quindi significa che dobbiamo chiudere il socket o la connessione – Prateek

+0

Quando si gestiscono API come 'HttpClient', non è necessario gestire direttamente i socket. Anche nel caso di 'HttpClient' c'è un metodo (' httpclient.getConnectionManager(). Shutdown(); ') per arrestare il' HttpClient' che fa il lavoro di chiudere le connessioni. – Santosh

+0

ma non devo chiudere le connessioni mentre sto facendo il connection pooling. Cosa devo fare per smettere di aspettare una risposta per una richiesta. – Prateek

5

La spiegazione dettagliata viene fornita in Connection management documentation sul sito client HTTP Apache.

CoreConnectionPNames.SO_TIMEOUT = 'http.socket.timeout': definisce il timeout presa (SO_TIMEOUT) in millisecondi, che è il timeout per attesa dei dati o, in altri termini, un'inattività periodo massimo fra due consecutivi pacchetti di dati). Un valore di timeout pari a zero viene interpretato come un timeout infinito. Questo parametro si aspetta un valore di tipo java.lang.Integer. Se questo parametro non è impostato, le operazioni di lettura non scadono (timeout infinito).

CoreConnectionPNames.CONNECTION_TIMEOUT = 'http.connection.timeout': determina il timeout in millisecondi fino a quando non viene stabilita una connessione. Un valore di timeout pari a zero viene interpretato come un timeout infinito. Questo parametro si aspetta un valore di tipo java.lang.Integer. Se questo parametro non è impostato, le operazioni di connessione non scadono (timeout infinito).

Manager Timeout connessione (http.connection-manager.timeout) - il tempo di attesa per una connessione dal responsabile del collegamento/piscina

Solo per la cronaca

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

è un altro modo di fare

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

(.210)

0

In parole semplici: tempo

  • collegamento fuori: il limite di tempo l'applicazione attende che quando si cerca di stabilire una connessione con il server e non è in grado di (l'indirizzo è sbagliato, o la server è inattivo ecc ...)
  • Timeout socket: il limite di tempo che l'applicazione attende dopo essere stato collegato al server ma ancora in attesa di una risposta (il ritardo può essere causato dal server sospeso ad esempio)
  • Connessione timeout del gestore: il limite di tempo che una richiesta attende quando è in coda in attesa di una delle richieste in t lui raggruppa per essere liberato. In altre parole, in HTTP abbiamo un pool di connessioni con una dimensione massima. Quando c'è un carico sull'applicazione, il pool può essere pieno e qualsiasi nuova richiesta deve attendere l'arrivo di un'altra richiesta dal pool.
0

Questo diagramma di sequenza può essere d'aiuto.

sequence diagram for timeouts

Problemi correlati