2012-03-15 10 views
5

Estoy usando HttpClient 4.1.2. Establecer ConnectionTimeout y SocketTimeout en un valor nunca es efectivo.Java: HttpClient 4.1.2: ConnectionTimeout, los valores de SocketTimeout establecidos no son efectivos

código:

Long startTime = null; 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpParams params = httpClient.getParams(); 
    HttpConnectionParams.setConnectionTimeout(params, 30); 
    HttpConnectionParams.setSoTimeout(params, 60);  
    HttpGet httpget = new HttpGet("http://localhost:8080/Test/ScteServer");   
     try {   
     startTime = System.currentTimeMillis(); 
     HttpResponse response = httpClient.execute(httpget); 
     } 
     catch(SocketTimeoutException se) { 
     Long endTime = System.currentTimeMillis(); 
     System.out.println("SocketTimeoutException :: time elapsed :: " + (endTime-startTime)); 
     se.printStackTrace(); 
     }   
     catch(ConnectTimeoutException cte) { 
     Long endTime = System.currentTimeMillis(); 
     System.out.println("ConnectTimeoutException :: time elapsed :: " + (endTime-startTime)); 
     cte.printStackTrace(); 
     } 
     catch (ClientProtocolException e) {    
     e.printStackTrace(); 
     } 
     catch (IOException e) { 
     Long endTime = System.currentTimeMillis(); 
     System.out.println("IOException :: time elapsed :: " + (endTime-startTime));    
     e.printStackTrace(); 
     }  

Si el servidor no funciona, entonces el tiempo de espera de la conexión no es nunca antes de 400 ms cuando se tiene que el tiempo de espera en el ~ 30 ms como se ha configurado.

Igual es el caso para Socket Timeout, poner un reposo en doGet() durante 5000 ms arrojará un tiempo de espera de socket que nunca será de alrededor de 60 ms como se configuró. Lleva más de 500 ms.

¿Alguien puede sugerir cómo configurar HttpClient 4.1.2 para que se agote el tiempo configurado?

Respuesta

12

El HttpConnectionParams debe pasarse a un administrador de conexión (consulte this question). Cuando se utiliza el DefaultHttpClient puede ajustar estos parámetros como este:

httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000); 
    httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 60000); 

Véase el documentation también!

+1

Lanza '' java.lang.UnsupportedOperationException' – Niklas

+3

httpclient.getParams() 'está obsoleta desde 4.3 – oleh

5

Puede probar este (trabaja con Apache HTTP-cliente 4.5.2):

int DEFAULT_TIMEOUT = 5000; 
RequestConfig requestConfig = RequestConfig.custom() 
    .setConnectTimeout(DEFAULT_TIMEOUT) 
    .setConnectionRequestTimeout(DEFAULT_TIMEOUT) 
    .setSocketTimeout(DEFAULT_TIMEOUT) 
    .build(); 
CloseableHttpClient httpClient = HttpClients.custom() 
    .setDefaultRequestConfig(requestConfig) 
    .build(); 
Cuestiones relacionadas