JavaでHTTPするときのRetryができるクライアントまとめ
個人用メモとして記事にしておきます。
httpのリクエストが500系エラーなどになった場合に、リトライ処理についてまとめます。
google http client
ExponentialBackOff backoff = new ExponentialBackOff.Builder() .setInitialIntervalMillis(500) .setMaxElapsedTimeMillis(900000) .setMaxIntervalMillis(6000) .setMultiplier(1.5) .setRandomizationFactor(0.5) .build(); request.setUnsuccessfulResponseHandler(new HttpBackOffUnsuccessfulResponseHandler(backoff));
- 最大経過時間とインターバルの間でリトライを行う
- リトライ回数は指定できない
Akka http
val responseFuture = Http().singleRequest(HttpRequest(method = requestMethod, uri = url, entity = HttpEntity(requestBody).withContentType(ContentTypes.`application/json`) )) responseFuture.onComplete { case Success(r) => if (r.status.isFailure()) Future.failed(new Exception("request failed with status 404")) else r case Failure(e) => throw e } def retryFuture[T](retries: Int, delay: FiniteDuration = 1.second)(fn: => Future[T])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = { fn.recoverWith { case _ if retries > 0 => after(delay, s)(retryFuture(retries - 1, delay)(fn)) } }
- リトライ回数などある程度自由に制御できそう
- Akka httpのライブラリが必要
自力で頑張る
- 自由に制御できる反面バグなどを作り込む可能性が・・・
他にもあれば足していきます。(良いライブラリがあれば教えてください!)