Я пытаюсь добавить механизм повтора к вызову отдыха веб-клиента, используя функцию resilience4j, которая не работает. Метод вызывается только один раз в случае исключения. Я использую весеннюю загрузку 2 с kotlin.
Это вызывающая сторона
GlobalScope.launch {
println(service.callRest())
}
Это конфигурация
resilience4j.retry:
configs:
default:
maxRetryAttempts: 3
waitDuration: 100
retryExceptions:
- java.lang.IllegalArgumentException
- java.util.concurrent.TimeoutException
- org.springframework.web.client.HttpServerErrorException
- java.io.IOException
- java.net.UnknownHostException
- org.springframework.web.reactive.function.client.WebClientResponseException
- org.springframework.web.reactive.function.client.WebClientResponseException$NotFound
- org.springframework.web.client.HttpClientErrorException$NotFound
instances:
backendA:
baseConfig: default
Это мой метод:
@Retry(name = BACKEND_A)
suspend fun callRest(): String {
println("tried calling")
return webClient.get()
.uri("/api/v1/dummy1")
.accept(APPLICATION_JSON)
.retrieve()
.awaitBody()
}
Если я выбрасываю жестко закодированное исключение из метода, повторная попытка работает правильно
@Retry(name = BACKEND_A)
@Throws(WebClientResponseException::class)
suspend fun callRest(): String {
println("tried calling")
throw WebClientResponseException("abc", 404, "abc", null, null, null)
Кроме того, он работает с restTemplate
@Retry(name = BACKEND_A)
fun callRestTemplate(): String {
println("tried calling")
return restTemplate
.getForObject("/api/v1/dummy1")
}