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_STATUSES
はInteger型の配列
で、リトライさせたいHTTPステータスコード群
を定義してくだしあ
・MAX_RETRY_COUNT
は リトライする上限数
を定義してくだしあ
・RETRY_INTERVAL_MILL_SEC
は リトライするインターバルのミリ秒
を定義してくだしあ
これで、コピペプログラマーでもリトライ処理が書けるよね!