You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring @Retryable注解:重试时创建新连接还是复用原有连接?

Spring @Retryable 重试的线程与连接复用逻辑

线程层面

@Retryable 基于Spring AOP实现方法增强,所有重试动作都会在原调用线程中执行,不会创建新线程。@Backoff配置的延迟等待,也是在原线程内阻塞完成后,继续执行重试的方法调用。

连接层面

API调用的连接复用与否和@Retryable本身无关,完全由你使用的HTTP客户端的连接池配置决定:

  • 若HTTP客户端(如RestTemplate、WebClient、OkHttp等)配置了连接池,重试时会优先复用连接池中的空闲连接,不会每次新建TCP连接。
  • 若未配置连接池,每次调用API(包括重试)都会新建一个TCP连接。

举个带连接池的RestTemplate配置示例:

@Bean
public RestTemplate restTemplate() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setConnectTimeout(5000);
    factory.setConnectionRequestTimeout(5000);
    
    PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
    connectionManager.setMaxTotal(20);
    connectionManager.setDefaultMaxPerRoute(10);
    
    factory.setHttpClient(HttpClients.custom().setConnectionManager(connectionManager).build());
    return new RestTemplate(factory);
}

这种配置下,重试过程会复用连接池内的连接;如果使用默认无连接池的RestTemplate,每次调用都会新建连接。

总结

  • 线程:复用原调用线程,无新线程创建
  • 连接:由HTTP客户端的连接池配置决定,与@Retryable无关

内容的提问来源于stack exchange,提问作者Tech Savy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:42:03