2012-11-08 65 views
2

的单一实例我使用的DefaultHttpClient一个单实例结合PoolingClientConnectionManager以在多线程方式执行HTTP操作的cconsiderable数量(每秒倍数)。我的代码基本上是:超时与DefaultHttpClient

final HttpParams httpClientParams = new BasicHttpParams(); 
httpClientParams.setParameter("http.protocol.version", HttpVersion.HTTP_1_1); 
HttpConnectionParams.setConnectionTimeout(httpClientParams, 700); 
HttpConnectionParams.setSoTimeout(httpClientParams, 700); 
DefaultHttpClient client = new DefaultHttpClient(poolingClientConnectionManager, httpClientParams); 

那么我就要从多个线程访问client对象并行。

我的问题是,超时没有得到尊重,我的HTTP请求比指定的700ms花费的时间长得多。

  • 是否安全,设置超时时间在客户端上如我上面做什么?
  • 对于很多平行请求使用单个实例DefaultHttpClient是否安全?
+0

看起来'PoolingClientConnectionManager'池太小,因此请求花了很长时间。扩大游泳池已经解决了这个问题。 – Frederic

回答

2
  • 是否安全,设置超时时间在客户端上如我上面做什么?

是的,它是安全的。但是,HttpClient级别参数表示由所有请求继承的默认设置。人们不应该在运行时干涉这些设置。通常最好使用请求级别参数来配置个别请求。

  • 是可以安全使用DefaultHttpClient的单一实例许多并行请求?

不仅安全,而且强烈建议。通过共享相同的HttpClient实例,通过重新使用持久连接的共享池,可以更高效地执行各个请求。

另请确保您对超时行为的期望是正确的。超时值表示两个连续 I/O操作之间不活动的最大周期,而不是最大总请求执行时间。

+0

感谢您的回答,提供了一些见解!如果你有一个链接到所有这些说明的文档,它会更好。 – Frederic

+0

@Fred HttpClient教程的任何特别错误? http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html – oleg