LoginSignup
5
4

More than 5 years have passed since last update.

org.apache.http.client で 任意のHTTPステータス時にHttpRequestをリトライさせるHttpClientの作り方

Last updated at Posted at 2018-08-04

org.apache.http.client 使用して生成したHTTPクライアントからHTTPリクエストを投げて、
返ってきたHTTPステータス(200とか404とか503とか)によってリトライしたいな〜
と言う時があって、その時の解決方法。

(同プロジェクトメンバーに、「バージョンが書いてなくてつらい」って言われたので動作バージョンを一応書きます。)

  • httpclient-4.5.1
  • httpcore-4.4.3

を使用した環境で動作確認済みです!

いつか誰かの助けになる事を願って、備忘録がわりに。



RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout).build();

final HttpClientBuilder hcBuilder = HttpClientBuilder.create()
        .setDefaultRequestConfig(requestConfig) 
        // HTTPのIO系エラー発生時のリトライ 
        .setRetryHandler(new DefaultHttpRequestRetryHandler()) 
        // HTTPリクエスト時に retryRequestの真偽値によってリトライするか否か変わる 
        .setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() {
            @Override
            public boolean retryRequest(
                    final HttpResponse response, final int executionCount, final HttpContext context) {
                int statusCode = response.getStatusLine().getStatusCode();
                return Arrays.asList(RETRY_HTTP_STATUSES).contains(statusCode)
                        && executionCount < MAX_RETRY_COUNT;
            }

            @Override
            public long getRetryInterval() {
                return RETRY_INTERVAL_MILLI_SEC;
            }
        });
return hcBuilder.build();

言わずもがな、ですが補足をすると
RETRY_HTTP_STATUSESInteger型の配列で、リトライさせたいHTTPステータスコード群を定義してくだしあ
MAX_RETRY_COUNTリトライする上限数を定義してくだしあ
RETRY_INTERVAL_MILL_SECリトライするインターバルのミリ秒を定義してくだしあ

これで、コピペプログラマーでもリトライ処理が書けるよね!

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4