前言
最近,我无疑间看到同事提交到git上的httpclient调用第三方服务设置超时代码,发现有趣的一件事。项目中引用的httpclient版本是4.4.5版本,结果同事为了设置超时,在项目的pom.xml中又增加了一个低版本的httpclient依赖。然后按照低版本的超时写法设置httpclient调用超时。这里并不是说低版本的超时稳定性更好,可能同事不知道4.4.5版本升级之后的设置超时写法。这里和大家学习httpclient超时设置。
为什么要设置超时
我们经常在服务中集成httpclient或者okHttp去调用第三方服务。httpclient默认是没有设置超时时间的,这时候如果第三方的服务因为某些因素导致响应变慢,或者直接挂掉了。当我们服务调用第三方接口,在建立连接,或者等待第三方服务的响应的时候,由于长时间没有得到响应,服务痴情等待,日渐消瘦导致服务自身性能损耗,响应变慢。如果我们在调用第三方服务的时候设置一个固定的时间,在这个时间内没有等到响应,我们就是结束请求,天涯何处无芳草,何必单恋一枝花。这里的超时机制类似一个熔断,避免造成雪崩效应。
如何设置
前面说到,同时为了给httpclient设置超时,强行将httpclient版本降低了。这显然是对httpclient的几个大版本设置超时时间不熟悉导致的。
- 3.X的超时设置
HttpClient client = new HttpClient();
client.setConnectionTimeout(30000);
client.setTimeout(30000);
HttpClient httpClient= new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
- 4.3之前超时设置
HttpClient httpClient=new DefaultHttpClient();
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);//连接时间
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);//数据传输时间
- 4.3之后超时设置
CloseableHttpClient httpClient = HttpClients.createDefault();
tpGet httpGet=new HttpGet("http://www.aiqihai.com");
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)
.setConnectionRequestTimeout(1000).setSocketTimeout(5000).build();
httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);
对于上面的三个时间,我们需要知道具体代表什么。setConnectTimeout:设置连接超时时间,单位毫秒。setConnectionRequestTimeout:设置从connect Manager获取Connection 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。setSocketTimeout:请求获取数据的超时时间(单位毫秒)。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
总结
上面简单介绍了httpclient设置超时的一些小细节,对于httpclient调用其他知识后续在和大家一起学习!