我最近使用过httpclient 4.3,我知道api已被更改,但如果没有设置超时阈值(conenction或socket或conenctionmanager),它可以工作,这意味着没有无限循环查询,而method.getResponseBodyAsString()会返回一个空字符串,但在文档中,它表示超时的默认参数设置是无限的,那么它是如何工作的?
public class ContentModelUtils {
private static HttpClient client = new HttpClient();
...
public static String fetchPlainHttpResult(String id, Map<String, String> result, String getUrl)
throws HttpException, IOException {
method = new GetMethod(fetchPlainUrl(id, result, getUrl));
//client.getParams().setParameter("http.socket.timeout",1000);
//client.getParams().setParameter("http.connection.timeout",1000);
//client.getParams().setParameter("http.connection-manager.timeout",10000L);
client.executeMethod(method);
if (method.getStatusCode() != 200) {
return null;
}
String outputValue = new String(method.getResponseBodyAsString());
return outputValue;
}
...
答案 0 :(得分:0)
默认设置实际上是无限超时。为了证明这一点,让我们浏览source repository for Apache HttpCore 4.3.x。
在BasicConnFactory中,我们可以看到它拉动连接超时设置,并且检索超时参数的代码行使用默认值0
。
this.connectTimeout = params.getIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 0);
稍后,在BasicConnFactory#create中,此超时值将传递到套接字连接。
socket.connect(new InetSocketAddress(hostname, port), this.connectTimeout);
根据Socket#connect的文档,超时值0
(我们之前看到的是默认值)被解释为无限超时。
使用指定的超时值将此套接字连接到服务器。超时为零被解释为无限超时。然后连接将阻塞,直到建立或发生错误。