Apache HttpClient - ConnectionTimeout和SoTimeout

时间:2016-10-26 17:29:37

标签: java apache-httpclient-4.x

Apache HttpClient允许配置两个超时: ConnectionTimeout SoTimeout

这是人们通常创建通用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 - < / p>

我有两个问题:

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

2)通用场景的ConnectionTimeout和SoTimeout的推荐值是什么?

1 个答案:

答案 0 :(得分:0)

  1. 因为这是他们设计的方式。知道为什么不会改变你的生活。
  2. 10s就足以进行连接超时。读取超时值完全取决于预期的服务时间。您需要将其设置得足够高以允许负载峰值,但要足够低以使其有用。您可以将其设置为预期服务时间的两倍,或者如果您有相应的统计数据,则将其设置为高于它的两个或三个标准偏差。