2011-09-19 22 views
6

estoy usando HttpURLConnection de Java para golpear foo.comresolución de Java HttpURLConnection DNS con múltiples direcciones IP

foo.com tiene múltiples registros A que apuntan a diferentes direcciones IP (1.1.1.1 y 1.1.1.2)

Si mi primera llamada de conexión se resuelve en 1.1.1.1, pero luego esa máquina falla, ¿lo reconocerá una llamada de conexión posterior e intentará conectarse en 1.1.1.2?

¿O tengo que implementar este tipo de lógica yo mismo usando la API INetAddress?

+0

Si el parámetro es una url en lugar de una ip, entonces no necesita preocuparse por esto. – Jacob

Respuesta

6

Pude resolver esto usando Apache Commons HttpClient, vea el siguiente fragmento de código.

Como temía, la URLConnection proporcionada por java.net es una implementación muy simple y solo probará la primera dirección IP de la lista resuelta. Si realmente no puede usar otra biblioteca, tendrá que escribir su propio manejo de errores. Es un poco desordenado, ya que tendrá que resolver todas las direcciones IP manualmente con InetAddress, y conectarse a cada IP pasando el encabezado "Host: domain.name" a la pila HTTP usted mismo hasta que una de las direcciones IP responda.

La biblioteca Apache es mucho más robusta y permite una gran personalización. Puede controlar cuántas veces lo volverá a intentar y, lo que es más importante, probará automáticamente todas las direcciones IP resueltas con el mismo nombre hasta que una de ellas responda correctamente.

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() { 
    @Override 
    public boolean retryRequest(IOException exception, int count, HttpContext context) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
     } 
     return count < 30; 
    } 
}; 

ConnectionKeepAliveStrategy keepAlive = new ConnectionKeepAliveStrategy() { 
    @Override 
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) { 
     return 500; 
    } 
}; 

DefaultHttpClient httpclient = new DefaultHttpClient(); 
httpclient.getParams().setParameter("http.socket.timeout", new Integer(2000)); 
httpclient.getParams().setParameter("http.connection.timeout", new Integer(2000)); 
httpclient.setHttpRequestRetryHandler(myRetryHandler); 
httpclient.setKeepAliveStrategy(keepAlive); 
HttpGet httpget = new HttpGet("http://remotehost.com"); 
HttpResponse httpres = httpclient.execute(httpget); 
InputStream is = httpres.getEntity().getContent(); 

espero que esto ayude!

Cuestiones relacionadas