私は会社が開発したアプリケーションを勉強しています。 Apache HttpClientライブラリを使用します。ソースコードでは、HttpClient
クラスを使用して、サーバーに接続するインスタンスを作成します。
Apache HttpClientについて学びたいと思います この一連の例 。すべての例では、CloseableHttpClient
の代わりにHttpClient
を使用しています。 CloseableHttpClient
はHttpClient
の拡張バージョンだと思います。この場合、2つの質問があります。
最も簡単な形式のリクエスト実行プロセスの例を次に示します。
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet( "http:// localhost /"); CloseableHttpResponse response = httpclient.execute(httpget); try //何かをする }最後に{ response.close(); }
HttpClientリソースの割り当て解除:インスタンスCloseableHttpClientが不要になり、範囲外になろうとする場合、それに関連付けられている接続マネージャーは、呼び出しによってシャットダウンする必要がありますCloseableHttpClient#close()メソッド。
CloseableHttpClient httpclient = HttpClients.createDefault(); try { //何かをする }最後に{ httpclient.close(); }
リファレンス を参照して、基礎を学習してください。
@Scadge Java 7以降、 try-with-resources ステートメントを使用すると、ステートメントの最後で各リソースが閉じられます。
try(CloseableHttpClient httpclient = HttpClients.createDefault()){
//do something with httpclient here
}
同じ質問がありました。他の答えは、close()が本当に必要な理由に対処していないようです?また、Opは、HttpClientなどと連携するための好ましい方法を見つけるのに苦労しているようです。
Apache によると:
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.
さらに、関係は次のようになります。
HttpClient
(インターフェース)実装者:
CloseableHttpClient
-ThreadSafe。
DefaultHttpClient
-ThreadSafeしかし 非推奨 、代わりにHttpClientBuilder
を使用します。
HttpClientBuilder
-ThreadSafeではありませんが、ThreadSafeCloseableHttpClient
を作成します。
- CUSTOM
CloseableHttpClient
の作成に使用します。
HttpClients
-ThreadSafeではありませんが、ThreadSafeCloseableHttpClient
を作成します。
- DEFAULTまたはMINIMAL
CloseableHttpClient
を作成するために使用します。
Apacheによる好ましい方法:
CloseableHttpClient httpclient = HttpClients.createDefault();
例 彼らが与えることは、finally
節でhttpclient.close()
を行い、またResponseHandler
節も利用します。
別の方法として、mkyongが行う方法も少し興味深いです。
HttpClient client = HttpClientBuilder.create().build();
彼はclient.close()
呼び出しを表示しませんが、client
は依然としてCloseableHttpClient
のインスタンスなので、必要だと思います。
他の回答は、close()
が本当に必要な理由に対処していないようです。 * 2
古い3.x httpcomponents doc で言及されていますが、これは長い歴史があり、4.x HCとは大きく異なります。その上、説明は非常に簡潔であるため、この基礎となるリソースが何であるかはわかりません。
4.5.2リリースのソースコードに関する調査を行いましたが、CloseableHttpClient:close()
の実装は基本的に接続マネージャーを閉じるだけであることがわかりました。
(FYI)そのため、共有PoolingClientConnectionManager
を使用してクライアントclose()
を呼び出すと、例外Java.lang.IllegalStateException: Connection pool shut down
が発生します。回避するために、setConnectionManagerShared
は機能します。
CloseableHttpClient:close()
することを好みますリクエストを行うときに新しいhttpクライアントインスタンスを作成し、最終的に閉じていました。この場合、close()
を呼び出さないことをお勧めします。接続マネージャに「共有」フラグがない場合、シャットダウンされるため、1回の要求には高すぎます。
実際、Apache HC 4.5のClojureラッパーであるライブラリ clj-http でも、close()
を呼び出していません。ファイルのfunc request
を参照してください core.clj
ライブラリの次のメジャーバージョンでは、HttpClient
インターフェイスはCloseable
を拡張します。それまでは、以前の4.xバージョン(4.0、4.1、4.2)との互換性が不要な場合は、CloseableHttpClient
を使用することをお勧めします。
HttpClient
はクラスではなく、インターフェイスです。意図した方法で開発に使用することはできません。
必要なのは、HttpClient
インターフェイスを実装するクラスであり、それはCloseableHttpClient
です。
CloseableHttpClient
は、すべての実装で使用されるhttpclientライブラリの基本クラスです。他のサブクラスの大部分は非推奨です。
HttpClient
は、このクラスおよび他のクラスのインターフェースです。
次に、コードでCloseableHttpClient
を使用し、HttpClientBuilder
を使用して作成する必要があります。特定の動作を追加するためにクライアントをラップする必要がある場合は、HttpClient
でラップする代わりに要求インターセプターと応答インターセプターを使用する必要があります。
この答えは、httpclient-4.3のコンテキストで与えられました。