Java
HttpClient
retry
HTTPStatusCode
org.apache.http.client

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

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リトライするインターバルのミリ秒を定義してくだしあ

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