Apache HttpClient允许配置两个超时:ConnectionTimeoutSoTimeout

人们通常是这样创建通用HttpClient实例的:

PoolingClientConnectionManager conman = new PoolingClientConnectionManager();
conman.setMaxTotal(200);
conman.setDefaultMaxPerRoute(100);
HttpClient httpClient = new DefaultHttpClient(conman);
HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 1000);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 1000);


ConnectionTimeout参数很棘手,它涵盖了两种方案:


HttpClient可能抛出org.apache.http.conn.ConnectTimeoutException: Connect to example.com timed out-如果它无法建立基础的TCP连接
另外,它可能会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool-当连接池已满并且在此时间段内无法从池中获得新连接时


我对此有两个问题:

1)是否有理由将这两个实际上不同的超时合并在单个ConnectionTimeout参数下。
例如,没有办法等待来自池的可用连接10秒钟,但是将socket-connection-timeout保持为1 sec

2)对于通用场景,ConnectionTimeout和SoTimeout的建议值是什么?

最佳答案

因为这就是他们设计的方式。知道为什么不会改变你的生活。
10s足以连接超时。读取超时值完全取决于预期的服务时间。您需要将其设置得足够高以允许负载尖峰,但又要足够低才能有用。您可以将其设置为预期服务时间的两倍,或者将其设置为预期服务时间以上的两个或三个标准偏差。

关于java - Apache HttpClient-ConnectionTimeout和SoTimeout,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40268616/

10-10 18:51