application.ymlで設定した値を@Valueでクラスに定義したら読み込まれていないようでハマった。初期化ブロックのinit内でprintlnで出力してみるとやはりデフォルト値になっていて読み込まれていなかった。
external:
task:
connect-timeout-millis: 3000
read-timeout-millis: 3000
@Repository
class TaskRepository(restTemplateBuilder: RestTemplateBuilder) {
@Value("\${external.task.connect-timeout-millis}")
val connectTimeoutMillis: Long = 0
@Value("\${external.task.read-timeout-millis}")
val readTimeoutMillis: Long = 0
private var restTemplate: RestTemplate? = null
init {
println("connectTimeoutMillis : $connectTimeoutMillis ms")
println("readTimeoutMillis : $readTimeoutMillis ms")
restTemplate = restTemplateBuilder
.setConnectTimeout(Duration.ofMillis(connectTimeoutMillis))
.setReadTimeout(Duration.ofMillis(readTimeoutMillis))
.build()
}
2020-12-17 08:24:15.152 INFO 1791 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2087 ms
connectTimeoutMillis : 0 ms
readTimeoutMillis : 0 ms
意図的にReadTimeoutを発生させて実際の動作を確認してみると、readTimeoutMillisが効いてる時と効いていない時があった。なのでタイミングによって読み込みの動作が変わってしまうように見える。
以下のように、プライマリーコンストラクタ内で@Valueを定義するように修正
@Repository
class TaskRepository(restTemplateBuilder: RestTemplateBuilder,
@Value("\${external.task.connect-timeout-millis}") private val connectTimeoutMillis: Long,
@Value("\${external.task.read-timeout-millis}") private val readTimeoutMillis: Long
) {
結果は常に読み込まれている事を確認できた。実際の動作も正しくtimeoutが効いている。
2020-12-17 08:33:44.295 INFO 1843 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1640 ms
connectTimeoutMillis : 3000 ms
readTimeoutMillis : 3000 ms
参考
Spring公式 2.7. Type-safe Configuration Properties ここに書いてあると思われるけどいまいち分からなかったので要調査。
コメントを残す