1. ホーム
  2. java

HttpClient 4.0.1 - 接続を解放する方法は?[重複)。

2023-10-31 05:35:47

質問

たくさんのURLをループして、それぞれのURLに対して以下のようにしています。

private String doQuery(String url) {

  HttpGet httpGet = new HttpGet(url);
  setDefaultHeaders(httpGet); // static method
  HttpResponse response = httpClient.execute(httpGet);   // httpClient instantiated in constructor

  int rc = response.getStatusLine().getStatusCode();

  if (rc != 200) {
    // some stuff...
    return;
  }

  HttpEntity entity = response.getEntity();

  if (entity == null) {
    // some stuff...
    return;
  }

  // process the entity, get input stream etc

}

最初のクエリは問題ありませんが、2番目のクエリはこの例外を投げます。

スレッド "main"で例外が発生しました。 java.lang.IllegalStateException: の無効な使用 SingleClientConnManager の無効な使用: 接続がまだ割り当てられています。 接続がまだ割り当てられています。接続がまだ割り当てられています。 接続を解放してから、別の接続を割り当ててください。 接続を解放してから、別の接続を割り当ててください。 org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:199) at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:173) ......。

これは単なるシングルスレッドアプリです。この接続を解放するにはどうしたらよいでしょうか。

どのように解決するのですか?

私自身の質問に答えると、接続 (およびリクエストに関連するその他のリソース) を解放するには、HttpEntity が返す InputStream を閉じる必要があります。

InputStream is = entity.getContent();

.... process the input stream ....

is.close();       // releases all resources

からの ドキュメント