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
相关产品推荐
相关产品推荐

