学习参考:https://www.cnblogs.com/softidea/p/5977375.html
RestTemplate有两个构造方法,分别是:
publicRestTemplate() {/** ...初始化过程 */}
publicRestTemplate(ClientHttpRequestFactory requestFactory) {this();
setRequestFactory(requestFactory);
}
其中,第二个构造方法中可以传入ClientHttpRequestFactory参数,第一个进行默认初始化,因为我们经常需要对请求超时进行设置并能够对超时进行后续处理,而第一个构造方法,我们无法控制超时时间,第二个构造中的ClientHttpRequestFactory接口的实现类中存在timeout属性,因此选用第二个构造方法。
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(1000); requestFactory.setReadTimeout(1000); RestTemplate restTemplate =new RestTemplate(requestFactory);
注意:ClientHttpRequestFactory 接口有4个实现类,分别是:
AbstractClientHttpRequestFactoryWrapper 用来装配其他request factory的抽象类。
CommonsClientHttpRequestFactory 允许用户配置带有认证和http连接池的httpclient,已废弃,推荐用HttpComponentsClientHttpRequestFactory。
HttpComponentsClientHttpRequestFactory 同2.
SimpleClientHttpRequestFactory 接口的一个简单实现,可配置proxy,connectTimeout,readTimeout等参数。
配置案例:
private ClientHttpRequestFactory getClientHttpRequestFactory() {
int timeout = 5000;
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(timeout)
.setConnectionRequestTimeout(timeout)
.setSocketTimeout(timeout)
.build();
CloseableHttpClient client = HttpClientBuilder
.create()
.setDefaultRequestConfig(config)
.build();
return new HttpComponentsClientHttpRequestFactory(client);
RestTemplate 设置 RequestFactory
其实任何有连接的地方都会有连接池的概念,比如数据库连接等,这里也不例外,肯定也会有,RestTemplate 默认有两种工厂对象实现方式,都是 ClientHttpRequestFactory 的子类。如下
1)SimpleClientHttpRequestFactory 底层使用 java.net.HttpUrlConnection,可配置证书
2)HttpComponentsClientHttpRequestFactory 底层使用Apache HttpClient访问远程的Http服务,使用HttpClient同样可以配置连接池和证书等信息,而且功能更强大,配置项更多。
RequestFactory 的配置方式
1)使用XML配置,就是配置JavaBean
2)使用代码配置,就是初始化这个对象
无论上面那种方式配置,都是配置外壳 RestTemplate,真正发送请求的 request 对象其实都是由工厂管理的,所以我们不关心连接池的管理,只是配置连接池初始化的一些参数而已。
这个可以参考: