3

使用後、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()));
}
4

2 に答える 2

8

HttpResponseから取得するものは、それInputStreamを呼び出す必要がありますclose()close()HttpResponse自体にはありません。

たとえば、HttpResponsegetEntity()を取得し、HttpEntityを取得するために呼び出しgetContent()、InputStreamを取得するために呼び出す場合、コンテンツの読み取りが完了した後、InputStreamを呼び出しますclose()

于 2012-07-09T16:41:00.973 に答える
0

詳細は役に立ちますが、このようなことが起こる可能性があるいくつかの理由があります。

  1. 同じサーバーへの接続を開き続け、サーバーが接続を再利用することを期待している間(http1.1)、サーバーがそれらを閉じることを期待しているため、実際にはリークが発生します。

  2. 基盤となるトランスポート(ルーティングなど)で接続の問題が発生している可能性があるため、httpclientはTCPがタイムアウトするのを待機しています。

  3. サーバーはビジーであるがまだ応答していないため、接続を開いたままにしています。

于 2012-07-09T16:46:17.540 に答える