Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache HttpClient正在耗尽连接,但I';我不知道为什么?_Java_Apache Httpclient 4.x - Fatal编程技术网

Java Apache HttpClient正在耗尽连接,但I';我不知道为什么?

Java Apache HttpClient正在耗尽连接,但I';我不知道为什么?,java,apache-httpclient-4.x,Java,Apache Httpclient 4.x,使用一段时间后,HttpClient似乎在此处阻塞,导致我的整个应用程序冻结: Thread [main] (Suspended) Unsafe.park(boolean, long) line: not available [native method] LockSupport.park(Object) line: 186 AbstractQueuedSynchronizer$ConditionObject.await() line: 2043

使用一段时间后,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获取的
InputStream
需要调用
close()
。HttpResponse本身没有
close()


例如,当您获取HttpResponse并调用
getEntity()
获取HttpEntity,调用
getContent()
获取InputStream时,在读取完内容后,调用InputStream上的
close()

更多详细信息会有所帮助,但出现这种情况的原因如下:

  • 您一直在打开与同一服务器的连接,并希望服务器关闭这些连接,而服务器希望您重新使用该连接(http1.1),因此实际上存在泄漏

  • 您可能在底层传输(路由等)中存在连接问题,导致此问题,因此httpclient正在等待TCP超时

  • 服务器正在保持连接打开,因为它正忙,但尚未响应


  • 向我们展示您的代码,以及如何使用
    HttpClient
    API。对于初学者,尝试将
    execute()
    ResponseHandler
    参数一起使用
    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()));
    }