application.ymlに外部API接続失敗時のリトライ回数(初回コール含む)とインターバルのwait時間を追加。
external:
task:
url: http://localhost:50000
read-timeout-millis: 3000
connect-timeout-millis: 1000
connect-retry-attempts: 3 // 追加
connect-retry-interval-millis: 500 // 追加
@Retryableの設定を以下のようにapplication.ymlから取得するように変更。
application.ymlの設置値が文字列扱いなので、文字列を扱える属性に変更して、プロパティのパスを値として設定する。
AsIs
@Retryable(
value = [ConnectTimeoutException::class],
maxAttempts = 3,
backoff = Backoff(value = 500)
)
ToBe
@Retryable(
value = [ConnectTimeoutException::class],
maxAttemptsExpression = "#{\${external.task.connect-retry-attempts}}",
backoff = Backoff(delayExpression = "#{\${external.task.connect-retry-interval-millis}}")
)
確認
RestTemplateのデバッグログを出力する設定にしてリクエストを実行。
http://localhost:8080/tasks/12345
//1st
2021-01-08 09:45:50.264 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : HTTP GET http://127.0.0.2/users/1
2021-01-08 09:45:50.283 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : Accept=[application/json, application/*+json]
//2nd
2021-01-08 09:45:51.792 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : HTTP GET http://127.0.0.2/users/1
2021-01-08 09:45:51.793 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : Accept=[application/json, application/*+json]
//3rd
2021-01-08 09:45:53.300 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : HTTP GET http://127.0.0.2/users/1
2021-01-08 09:45:53.301 DEBUG 16991 --- [nio-8080-exec-1] o.s.web.client.RestTemplate : Accept=[application/json, application/*+json]
2021-01-08 09:45:54.325 WARN 16991 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://127.0.0.2/users/1": 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/33/files
コメントを残す