2

我正在使用一个单例实例来DefaultHttpClientPoolingClientConnectionManager多线程方式执行相当数量(每秒多个)的 HTTP 操作。我的代码基本上是:

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 请求花费的时间比指定的 700 毫秒长得多。

  • 像上面那样在客户端上设置超时是否安全?
  • DefaultHttpClient许多并行请求使用单例实例是否安全?
4

1 回答 1

2
  • 像上面那样在客户端上设置超时是否安全?

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

  • 对许多并行请求使用 DefaultHttpClient 的单例实例是否安全?

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

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

于 2012-11-08T10:47:59.930 回答