Как добавить resilience4j retry к вызову webclient с весенней загрузкой 2? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь добавить механизм повтора к вызову отдыха веб-клиента, используя функцию 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")
    }
...