2017-09-22 11 views
0

Apache HTTPクライアントがサーバーへの接続に失敗すると(IOException)、接続を再試行する可能性があります。ただし、次回の再試行まで待機しません。これは、ターゲットサーバが復旧しているときや新しいサーバが立ち上がっているときには、新しい要求の準備に時間がかかることがあるなど、控えめなようです。Apache HTTPクライアントの再試行の間に遅延がないのはなぜですか?

なぜそうですか?ここで

DefaultRequestDirectorから対応するコードです:

for (;;) { 
    context.setAttribute(ExecutionContext.HTTP_REQUEST, wrapper); 
    // Increment connect count 
    connectCount++; 
    try { 
     if (!managedConn.isOpen()) { 
      managedConn.open(route, context, params); 
     } else { 
      managedConn.setSocketTimeout(HttpConnectionParams.getSoTimeout(params)); 
     } 
     establishRoute(route, context); 
     break; 
    } catch (final IOException ex) { 
     try { 
      managedConn.close(); 
     } catch (final IOException ignore) { 
     } 
     if (retryHandler.retryRequest(ex, connectCount, context)) { 
      ... 
     } else { 
      throw ex; 
     } 
    } 
} 

答えて

0

DefaultRequestDirectorは確かに意図的にIOExceptionを無視して、このハードコーディングされたロジックを持っています。ただし、このAPIは4.3以降では使用されなくなりました。また、RetryHandlerを直接HttpClientBuilderに設定することもできます。

ます。また ConnectionExceptionを無視しますが、複数の構成方法で、非再試行-クラスのリストを定義することにより、(残念ながら、このコンストラクタは保護され、そのサブクラスを公開するために作成する必要がある DefaultHttpRequestRetryHandlerをオーバーライドする必要があります

そのコンストラクタ)。

CustomHttpRequestRetryHandler myRetryHandler = new CustomHttpRequestRetryHandler(3, false, 
     Collections.<Class<? extends IOException>>emptyList()); 
    CloseableHttpClient client = HttpClients.custom() 
     .setRetryHandler(myRetryHandler) 
     .build(); 

    private static class CustomHttpRequestRetryHandler extends DefaultHttpRequestRetryHandler { 
     public CustomHttpRequestRetryHandler(int retryCount, boolean requestSentRetryEnabled, Collection<Class<? extends IOException>> clazzes) { 
      super(retryCount, requestSentRetryEnabled, clazzes); 
     } 
    } 

幸運!

関連する問題