我目前正在运行一个程序,它将使用 Apache HttpComponents 从网站下载源代码。我将下载很多(10,000 次),因此我使用多个线程来执行此操作。
有时所有线程都死掉(加入),有时它们不会。通过调试我已经确定线路
CloseableHttpResponse response = httpClient.execute(httpget,context);
是问题所在。有谁知道我如何为这条线设置超时,或者为什么这条线会阻塞线程执行?
我目前正在运行一个程序,它将使用 Apache HttpComponents 从网站下载源代码。我将下载很多(10,000 次),因此我使用多个线程来执行此操作。
有时所有线程都死掉(加入),有时它们不会。通过调试我已经确定线路
CloseableHttpResponse response = httpClient.execute(httpget,context);
是问题所在。有谁知道我如何为这条线设置超时,或者为什么这条线会阻塞线程执行?
线程卡在 i/o 操作中可能有多种原因,不正确的超时设置是最可能的原因。RequestConfig
可以使用类设置所需的超时值。但是,如果所有线程都在#execute
方法连接泄漏(连接池耗尽)内同时被阻塞,则更有可能发生这种情况。即使不关心响应或其内容,也要确保始终关闭 CloseableHttpResponse 实例。您可以通过打开线路/上下文日志记录来了解有关请求执行的更多详细信息,如日志记录指南中所述
我在代码中的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)