web-dev-qa-db-ja.com

java:Apache HttpClient>再試行を無効にする方法

私はWebサイトのAjax呼び出しにApache Httpclientを使用しています。場合によっては、外部Webサービスへのリクエストが失敗することがあり、多くの場合、

要求の処理中にI/O例外(Java.net.ConnectException)がキャッチされました:接続がタイムアウトしました:接続。

その場合、たいていの場合、リクエストの再試行(Httpclientが自動的に行うように見えるもの)をスキップしたいと思います。

しかし、再試行をスキップするためのメソッドやパラメーターなどが見つかりません。

誰でも?

ありがとうGeert-Jan

27
Geert-Jan
client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));

それで十分でしょう。

31
Elie

Httpclient 4.3からHttpClientBuilderを使用

HttpClientBuilder.create().disableAutomaticRetries().build();
30
Manoj

HttpClient tutorial に説明があります。

 client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
           new DefaultHttpMethodRetryHandler());

詳細については tutorial を参照してください。たとえば、リクエストに副作用がある(べき等ではない)場合、これは害を及ぼす可能性があります。

6
jdigital

OK。ドキュメントに問題があります。また、APIとメソッドにも変更が加えられています。 DefaultHttpRequestRetryHandlerを使用したい場合は、次の方法で、

DefaultHttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
httpClient.setHttpRequestRetryHandler(retryHandler);

または

HttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
((AbstractHttpClient)httpClient).setHttpRequestRetryHandler(retryHandler);

最初の例では、具体的なDefaultHttpClientを使用します(これは、AbstractHttpClientのサブクラスであるため、setHttpRequestRetryHandler()メソッドがあります)。

2番目の例では、HttpClientインターフェイス(残念ながらそのメソッドを公開しておらず、これは奇妙な!! ehh)にプログラミングしているので、その厄介なキャストを実行する必要があります。

6
Abhishek Tyagi

AbstractHttpClientへのキャストは必要ありません。別の方法は、再試行パラメーターに対して DefaultServiceUnavailableRetryStrategy を0に設定して AutoRetryHttpClient を使用して戦略を使用することです。より良い方法は、AbstractHttpClientを拡張するか、HttpClientを実装して目的のメソッドを公開することです。

0
Dmitry