#25 [SpringBoot/KotlinでBFF]Spring-RetryでConnectTimeoutのリトライ処理を追加

Spring-Retryを使用して外部APIの呼び出し時にConnectTimeoutした場合のリトライ処理を追加。

application.ymlに必要な依存ライブラリを追加。spring-retryの他にspring-boot-starter-aopも必要。

    implementation("org.springframework.retry:spring-retry")
    implementation("org.springframework.boot:spring-boot-starter-aop")

リトライ処理ができるように設定するアノテーション@EnableRetryを追加。ここではMainクラスに追加。

@SpringBootApplication
@EnableRetry
class BffSampleApplication

fun main(args: Array<String>) {
    runApplication<BffSampleApplication>(*args)
}

外部APIを呼び出すRepository層にリトライ設定のアノテーション@Retryableを追加。

  • value : 指定したExceptionの時にリトライが行われる。
  • maxAttempts : 初回の呼び出しとリトライ回数の合計(何回試みるか)。指定しなければデフォルトは3。
  • backoff : リトライするまでのインターバルの設定。valueにmsecで指定。ExponentialBackoffなどリトライ方法を設定できるが、ここでは単純に500msecのwaitを行う設定。backoffを省略するとデフォルト1000msecのwaitになる。
    @Retryable(
            value = [ConnectTimeoutException::class],
            maxAttempts = 3,
            backoff = Backoff(value = 500)
    )

確認

RestTemplateのデバッグログを出力する設定にしてリクエストを実行。
http://localhost:8080/tasks/12345

// 1st
2021-01-06 08:13:30.177 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : HTTP GET http://127.0.0.2/tasks/12345
2021-01-06 08:13:30.177 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : Accept=[application/json, application/*+json]

// 2nd
2021-01-06 08:13:31.687 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : HTTP GET http://127.0.0.2/tasks/12345
2021-01-06 08:13:31.687 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : Accept=[application/json, application/*+json]

// 3rd
2021-01-06 08:13:33.194 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : HTTP GET http://127.0.0.2/tasks/12345
2021-01-06 08:13:33.196 DEBUG 13638 --- [nio-8080-exec-3] o.s.web.client.RestTemplate              : Accept=[application/json, application/*+json]

2021-01-06 08:13:34.208  WARN 13638 --- [nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://127.0.0.2/tasks/12345": Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to 127.0.0.2:80 [/127.0.0.2] failed: Connect timed out]

合計3回外部APIを呼び出している。ConnectTimeoutのタイムアウトを1000msecに設定しているので、APIをコールして1秒後にタイムアウトし、インターバルの500msec後に次のAPIを呼び出している。

コード

https://github.com/little-engineer/bff-sample/pull/32/files

参考

SpringRetryのGitHub READMEを参考に。デフォルト値などはソースコードを確認。

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。