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を参考に。デフォルト値などはソースコードを確認。
コメントを残す