2011-09-19 11 views
6

に対処し、私はfoo.comJavaのHttpURLConnectionのDNS解決が

foo.comを打つためにJavaのHttpURLConnectionのを使用しています異なるIPアドレス(1.1.1.1と1.1.1.2)

を指す複数のAレコードを持っています

私の最初の接続コールが1.1.1.1に解決され、そのマシンがダウンした場合、後続の接続コールがこれを認識し、代わりに1.1.1.2で接続しようとしますか?

また、この種のロジックを自分でINetAddress APIを使用して実装する必要がありますか?

+0

パラメータがipではなくurlの場合、このことに注意する必要はありません。 – Jacob

答えて

6

Apache Commons HttpClientを使用して解決できました。下記のコードをご覧ください。

私が恐れていたように、java.netによって提供されるURLConnectionは非常に単純な実装であり、解決されたリストから最初のIPアドレスだけを試します。実際に別のライブラリを使用することが許されていない場合は、独自のエラー処理を作成する必要があります。 InetAddressを使用する前にすべてのIPを解決し、 "Host:domain.name"ヘッダーを渡して各IPに接続し、IPの1つが応答するまで自分自身でHTTPスタックに接続する必要があります。

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

この情報が役立ちますようにお願いいたします。

関連する問題