0

我目前正在运行一个程序,它将使用 Apache HttpComponents 从网站下载源代码。我将下载很多(10,000 次),因此我使用多个线程来执行此操作。

有时所有线程都死掉(加入),有时它们不会。通过调试我已经确定线路

CloseableHttpResponse response = httpClient.execute(httpget,context);

是问题所在。有谁知道我如何为这条线设置超时,或者为什么这条线会阻塞线程执行?

4

2 回答 2

1

线程卡在 i/o 操作中可能有多种原因,不正确的超时设置是最可能的原因。RequestConfig可以使用类设置所需的超时值。但是,如果所有线程都在#execute方法连接泄漏(连接池耗尽)内同时被阻塞,则更有可能发生这种情况。即使不关心响应或其内容,也要确保始终关闭 CloseableHttpResponse 实例。您可以通过打开线路/上下文日志记录来了解有关请求执行的更多详细信息,如日志记录指南中所述

于 2013-10-14T10:28:57.313 回答
0

我在代码中的HttpConnectionParams中使用以下超时设置(HttpParams提供给HttpClient构造函数):

org.apache.http.params.HttpConnectionParams.setConnectionTimeout(HttpParams, int)
org.apache.http.params.HttpConnectionParams.setSoTimeout(HttpParams, int)

maxPerRoute我在使用多个线程连接到同一主机时发现的一个问题,当设置低于线程数时会发生阻塞/超时。看看PoolingClientConnectionManager

org.apache.http.impl.conn.PoolingClientConnectionManager.setDefaultMaxPerRoute(int)
于 2013-10-12T15:58:01.263 回答