经过一些使用后,HttpClient似乎在此处阻止,导致我的整个应用冻结:
Thread [main] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 186
AbstractQueuedSynchronizer$ConditionObject.await() line: 2043
AbstractConnPool$2(PoolEntryFuture<T>).await(Date) line: 131
HttpConnPool(AbstractConnPool<T,C,E>).getPoolEntryBlocking(T, Object, long, TimeUnit, PoolEntryFuture<E>) line: 281
AbstractConnPool<T,C,E>.access$000(AbstractConnPool, Object, Object, long, TimeUnit, PoolEntryFuture) line: 62
AbstractConnPool$2.getPoolEntry(long, TimeUnit) line: 176
AbstractConnPool$2.getPoolEntry(long, TimeUnit) line: 172
AbstractConnPool$2(PoolEntryFuture<T>).get(long, TimeUnit) line: 100
PoolingClientConnectionManager.leaseConnection(Future<HttpPoolEntry>, long, TimeUnit) line: 212
PoolingClientConnectionManager$1.getConnection(long, TimeUnit) line: 199
DefaultRequestDirector.execute(HttpHost, HttpRequest, HttpContext) line: 453
ContentEncodingHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, HttpContext) line: 927
ContentEncodingHttpClient(AbstractHttpClient).execute(HttpUriRequest, HttpContext) line: 826
ContentEncodingHttpClient(AbstractHttpClient).execute(HttpUriRequest) line: 804
...
我没有在返回的HttpResponse上看到任何“close()”或“release()”方法,我在这里做的不是我需要做什么?
根据请求,这是我的代码:
final HttpResponse hr = Misc.httpClient.execute(hg);
if (hr.getEntity().getContentType().getValue().toLowerCase().contains("html")) {
final Document doc = Jsoup.parse(hr.getEntity().getContent(), ContentType.getOrDefault(hr.getEntity()).getCharset(), urlAsString);
processDocument(url, doc);
} else if (hr.getEntity().getContentType().getValue().toLowerCase().contains("text/xml")) {
final SyndFeedInput input = new SyndFeedInput();
rssFeed = input.build(new InputStreamReader(hr.getEntity().getContent()));
}
答案 0 :(得分:8)
您从HttpResponse获得的InputStream
需要close()
调用它。 HttpResponse本身没有close()
。
例如,当您获得HttpResponse并致电getEntity()
以获取HttpEntity时,请在阅读完内容后调用getContent()
获取InputStream,请致电close()
InputStream。
答案 1 :(得分:0)
更多细节会有所帮助,但这里有几个原因可能会发生:
您继续打开与同一服务器的连接,并希望服务器关闭它们,而服务器希望您重用连接(http1.1),以便实际发生泄漏。
您可能在导致此问题的基础传输(路由等)中出现连接问题,因此httpclient正在等待TCP超时。
服务器保持连接打开,因为它很忙但尚未回复。