最近在搭建一个前端架构,其中用到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的知识,参考开源中国的文章。

- 大小: 48.1 KB
分享到:
相关推荐
在实际项目中,根据需求选择适当的HTTP方法、设置请求头、处理异常,以及选择合适的转换器,都是使用`RestTemplate`时需要考虑的关键点。在进行更高级的网络编程时,也可以考虑升级到`WebClient`以获得更好的性能和...
如果需要更复杂的配置,如设置超时、代理或自定义连接池,可以通过`ClientHttpRequestFactory`来创建`RestTemplate`。 8. 异步请求: 虽然`RestTemplate`主要用于同步操作,但Spring 4.0后引入了`...
3. **创建RestTemplate**:Spring Boot提供了`RestTemplate`,它是处理HTTP客户端操作的工具类。利用上面配置的`HttpClientConfig`,我们可以创建一个使用HttpClient的`RestTemplate`实例。 ```java @Autowired ...
此外,还可以自定义`RestTemplate`的行为,例如设置超时、添加拦截器、调整连接池配置等。 5. **使用示例** 使用`@Autowired`注解可以注入所需的`RestTemplate`实例,然后调用其方法来发起HTTP请求。例如,发送一...
2. 设置超时:通过`ClientHttpRequestFactory`设置连接和读取超时。 3. 使用拦截器:可以实现`ClientHttpRequestInterceptor`接口,添加自定义的请求/响应拦截逻辑。 六、最佳实践 - 使用Spring Boot时,考虑使用`...
你可以通过`HttpRequestRetryHandler`来控制何时重试请求,通过`HttpClientBuilder.addInterceptorFirst`添加自定义的请求和响应拦截器。 8. **日志记录** 对于调试和监控,可以使用`LoggingHttpRequestExecutor`...