2011-09-19 20 views
6

Używam HttpURLConnection Javy trafić foo.comrozdzielczości Java HttpURLConnection DNS z wieloma adresami IP

foo.com ma wiele A-Records, które wskazują na różne adresy IP (1.1.1.1 i 1.1.1.2)

Jeśli moje pierwsze połączenie zostanie rozstrzygnięte na 1.1.1.1, ale urządzenie przestanie działać, czy to kolejne połączenie zostanie rozpoznane i spróbuje połączyć się w wersji 1.1.1.2?

Czy muszę wdrożyć ten rodzaj logiki samodzielnie za pomocą apletu INetAddress?

+0

Jeśli parametr jest adresem URL zamiast adresu IP, nie musisz się tym przejmować. – Jacob

Odpowiedz

6

Udało mi się rozwiązać ten problem, używając Apache Commons HttpClient, zobacz poniższy fragment kodu.

Obawiam się, że URLConnection zapewniony przez java.net jest bardzo prostą implementacją i wypróbuje tylko pierwszy adres IP z rozwiązanej listy. Jeśli naprawdę nie wolno ci korzystać z innej biblioteki, będziesz musiał napisać własną obsługę błędów. Jest to trochę kłopotliwe, ponieważ będziesz musiał rozwiązać wszystkie adresy IP przed użyciem strony InetAdress i połączyć się z każdym adresem IP przekazującym nagłówek "Host: domain.name" do stosu HTTP siebie, dopóki jedno z adresów IP nie odpowie.

Biblioteka Apache jest znacznie bardziej niezawodna i pozwala na wiele dostosowań. Możesz kontrolować ile razy spróbujesz i, co najważniejsze, automatycznie wypróbuje wszystkie adresy IP rozwiązane pod tą samą nazwą, aż jedna z nich odpowie poprawnie.

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

Mam nadzieję, że to pomoże!

Powiązane problemy