#26 [SpringBoot/KotlinでBFF]Spring-Retryの設定値をプロパティファイルから取得する

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

参考

Spring-RetryのGitHub

コメントを残す

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

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