如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?

Posted

技术标签:

【中文标题】如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?【英文标题】:How to add resilience4j retry to a spring boot 2 webclient call? 【发布时间】:2020-07-18 12:04:15 【问题描述】:

我正在尝试使用不工作的resilience4j 重试将重试机制添加到webclient 休息调用。如果出现异常,该方法只会被调用一次。我正在使用带有 kotlin 的 spring boot 2。

这是来电者

    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")
    

【问题讨论】:

【参考方案1】:

尝试为您的异步函数返回一个 Future。

@Retry(name = BACKEND_A)
fun callRestTemplate(): Future<String> 

我也看不到您的服务声明,但我遇到了同样的问题。在类上添加重试注释解决了它。

@Retry(name = BACKEND_A)
@Service
class BackendServiceA() 

【讨论】:

以上是关于如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 将 Log4j 添加到 maven 项目

弹性4j + spring boot 2 + EndpointAutoConfiguration 类未找到异常

将身份验证令牌添加到 Spring Data Neo4j Rest

使用 Resilience4j 框架实现重试机制

如何使用 client.bulk 方法在弹性搜索中设置冲突重试

将 log4j2.properties 配置到 Spring Boot 中的问题(使用 gradle)