我目前正在运行一个程序,它将从一个使用Apache HttpComponents的网站下载源代码。我将下载很多(10,000年代),所以我使用多个线程来做这件事。
有时所有线程都会死(连接),有时它们不会。
CloseableHttpResponse response = httpClient.execute(httpget,context);是问题所在。有谁知道我如何为这个行设置一个超时,或者为什么这一行阻塞线程执行?
发布于 2013-10-14 10:28:57
线程陷入i/o操作可能有各种原因,最有可能的原因是不正确的超时设置。可以使用RequestConfig类设置所需的超时值。但是,如果所有线程同时在#execute方法中被阻塞,那么连接泄漏(连接池耗尽)的可能性就会更大。确保始终关闭CloseableHttpResponse实例,即使不关心响应或其内容。您可以通过打开电线/上下文日志来了解有关请求执行的更多细节,如测井指南中所述。
发布于 2013-10-12 15:58:01
我在代码中使用了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)https://stackoverflow.com/questions/19335656
复制相似问题