Разрешение DNS Httpurlconnection DNS с несколькими IP-адресами - PullRequest
7 голосов
/ 20 сентября 2011

Я использую Java HttpUrlConnection для перехода на foo.com

На foo.com есть несколько A-записей, которые указывают на разные IP-адреса (1.1.1.1 и 1.1.1.2)

ЕслиМой первый вызов с подключением разрешается до 1.1.1.1, но затем эта машина выключается, будет ли последующий вызов с подключением распознавать это и пытаться вместо этого подключиться к 1.1.1.2?

Или мне нужно самому реализовать такую ​​логику с помощью API INetAddress?

1 Ответ

8 голосов
/ 18 октября 2012

Мне удалось решить эту проблему с помощью Apache Commons HttpClient , см. Фрагмент кода ниже.

Как я и опасался, URLConnection, предоставляемый java.net, является очень упрощенной реализацией и будет пробовать только первый IP-адрес из разрешенного списка. Если вам действительно не разрешено использовать другую библиотеку, вам придется написать свою собственную обработку ошибок. Это немного запутанно, так как вам нужно разрешить все IP-адреса заранее, используя InetAddress, и подключаться к каждому IP-адресу, передавая заголовок «Host: domain.name» в стек HTTP, пока один из IP-адресов не ответит.

Библиотека Apache значительно более надежна и позволяет выполнять множество настроек. Вы можете контролировать, сколько раз он будет повторяться, и, что наиболее важно, он будет автоматически проверять все IP-адреса, разрешенные для одного и того же имени, пока один из них не ответит успешно.

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

Надеюсь, это поможет!

...