RestTemplate添加超时处理ClientHttpRequestFactory的选择。

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

猜你喜欢

转载自nanjiwubing123.iteye.com/blog/2271966
今日推荐