2011-12-29 5 views
6

Attualmente sto usando il HTTPClient 4 per fare una richiesta POST a un server remoto come questo:Chiusura HttpClient connessione prima timout viene raggiunto

HttpResponse response = httpClient.execute(request); 
    InputStream is = response.getEntity().getContent(); 

Quando il server non è raggiungibile ci vuole una quantità di auto-configurato di tempo prima che la connessione scada veramente. Durante quel periodo, execute() è una chiamata bloccante.

Quello che sto cercando è un modo per cancellare execute() prima del timeout naturale in modo che il mio thread che esegue execute() non sia più bloccato e finisca con grazia.

Ho provato

request.abort(); 

e

httpClient.getConnectionManager().shutdown(); 

Ma entrambe queste chiamate non interrompere il execute(). C'è un altro modo per annullare il tentativo di connessione in corso?

risposta

0

Completare la chiamata in Future e richiamare get with timeout.

+0

Sto cercando un modo per fermare il blocco execute() di non aspettare più a lungo. – Moritz

+0

Il futuro impl "bloccherà" ma il thread chiamante può attendere una ~ misura precisa di msecs e quindi "timeout" e procedere alla sua maniera allegra. – alphazero

+0

Non voglio aspettare un intervallo preciso di tempo per impedire a execute() di bloccare il thread corrente. – Moritz

0

Penso che si può impostare connectionTimeout per qualunque sia il tempo massimo che si desidera utilizzare questi metodi: setConnectionTimeout()

setSoTimeout() 
+0

Ho già impostato il timeout della connessione. Il problema che sto affrontando è che voglio interrompere manualmente execute() prima che si verifichi il timeout. – Moritz

+0

Hai chiuso InputStream? Un'altra domanda è, 'richiesta' nella tua domanda, significa HttpGet/HttpPost? – kosa

+0

Non ho ottenuto alcun flusso di input perché il .execute() sta bloccando finché non si verifica il timeout del socket, nel qual caso viene lanciata una SocketException. Quello che voglio ottenere è fermare l'esecuzione (e il thread che viene bloccato) PRIMA che il timeout del socket entri in gioco. La richiesta è una richiesta POST. – Moritz