2011-09-19 18 views
6

sto usando HttpURLConnection di Java per colpire foo.comrisoluzione Java HttpURLConnection DNS con più indirizzi IP

foo.com ha molteplici A-record che fanno riferimento a diversi indirizzi IP (1.1.1.1 e 1.1.1.2)

Se la prima chiamata di connessione si risolve in 1.1.1.1, ma quella macchina si interrompe, una chiamata di connessione successiva lo riconoscerà e tenterà invece di connettersi su 1.1.1.2?

Oppure è necessario implementare questo tipo di logica utilizzando l'API INetAddress?

+0

Se il parametro è un url anziché un ip, non è necessario preoccuparsene. – Jacob

risposta

6

Sono stato in grado di risolvere questo utilizzando Apache Commons HttpClient, vedere lo snippet di codice di seguito.

Come temevo, l'URLConnection fornito da java.net è un'implementazione molto semplicistica e proverà solo il primo indirizzo IP dall'elenco risolto. Se davvero non ti è permesso usare un'altra libreria, dovrai scrivere la tua gestione degli errori. È un po 'complicato, dato che dovrai risolvere tutti gli IP prima di usare la mano InetAddress e connetterti a ogni IP passando l'intestazione "Host: domain.name" allo stack HTTP fino a quando uno degli IP non risponde.

La libreria Apache è molto più robusta e consente una grande quantità di personalizzazione. È possibile controllare quante volte riproverà e, soprattutto, tenterà automaticamente tutti gli indirizzi IP risolti con lo stesso nome fino a quando uno di essi risponde correttamente.

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(); 

Spero che questo aiuti!

Problemi correlati