RestTemplate添加超时处理ClientHttpRequestFactory的选择。 博客分类: Spring
程序员文章站
2024-02-14 20:36:28
...
最近在搭建一个前端架构,其中用到RestTemplate和AsyncRestTemplate的工具的集成,总结一下集
成该工具时的处理方式。
1:分析如何才能处理超时设置(方式之一)
先熟悉一下Spring RestTemplate的源码。
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations { public RestTemplate(ClientHttpRequestFactory requestFactory) { this(); setRequestFactory(requestFactory); } }
RestTemplate通过setRequestFactory重写了抽象类的HttpAccessor的方法
public abstract class HttpAccessor { private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); public void setRequestFactory(ClientHttpRequestFactory requestFactory) { this.requestFactory = requestFactory; } }
我们发现this.requestFactory 默认是没有超时时间处理的。
public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, AsyncClientHttpRequestFactory { private int connectTimeout = -1; private int readTimeout = -1; }
2:设置超时处理
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(10000); requestFactory.setReadTimeout(10000);
初始化RestTemplate时将requestFactory覆盖HttpAccessor的requestFactory,这个你懂的。
3:合理吗
查看RestTemplate源码,execute()都要执行如下方法。
/**代码有省略**/ protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException { ClientHttpResponse response = null; try { ClientHttpRequest request = createRequest(url, method); response = request.execute(); } catch (IOException ex) { } finally { if (response != null) { response.close(); } } }
最终执行createRequest(url, method)是ClientHttpRequestFactory接口
观察实现方法,对比HttpComponentsClientHttpRequestFactory和SimpleClientHttpRequestFactory,前者是用连接池管理数据库的链接,后者是每次调用restTemplate时都要打开一个链接,然后关闭,性能稍差一些。
更多:
a 关于Netty4和Netty4ClientHttpRequestFactory的知识,参考开源中国的文章。
上一篇: Oracle 归档模式与非归档模式的切换