8

アパッチ HttpClient 4.3b2、HttpCore 4.3。

PoolingHttpClientConnectionManager私は5つの接続を同時に管理するために使用します:

PoolingHttpClientConnectionManager connectionManager;
HttpClient httpclient;
connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(5);
httpclient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();

サーバーのキープアライブ時間は 5 秒です。connectionManager.shutdown()サーバーがクローズ接続プロセスを開始すると、connectionManager.closeExpiredConnections()手動で実行するまで FIN_WAIT2 状態のままになりますconnectionManager.closeIdleConnections(5, TimeUnit.SECONDS)。サーバーは FIN パッケージを待機します。サーバーがクローズプロセスを開始した後、クライアント側で接続を自動的に閉じるにはどうすればよいですか?

Chrome ブラウザーからリクエストを行うと、キープアライブによって接続を閉じようとすると、サーバーは TIME_WAIT 状態のままになります (FIN_WAIT2 状態は非常に急速に変化します)。Apache HttpClient で同じ動作を得るにはどうすればよいですか?

4

3 に答える 3

11

この問題は、HttpClient チュートリアルで詳しく説明されています。

従来のブロッキング I/O モデルの主な欠点の 1 つは、ネットワーク ソケットが I/O 操作でブロックされた場合にのみ I/O イベントに反応できることです。接続がマネージャーに解放されると、接続を維持できますが、ソケットのステータスを監視したり、I/O イベントに反応したりすることはできません。サーバー側で接続が閉じられた場合、クライアント側の接続は接続状態の変化を検出できません (そして、その側でソケットを閉じることによって適切に反応します)。

期限切れの接続を接続プールからプロアクティブに削除したい場合、アプリケーションに適した接続削除ポリシーを適用する追加のスレッドを実行する方法はありません。

于 2013-09-09T14:58:28.490 に答える