2

HttpClient(apache.DefaultHttpClient) オブジェクトのプール (GenericObjectPool) があります。HttpPost オブジェクトは、これらのクライアントを介して実行のために配置され、Post 要求が同時に送信される場合があります。使用されるプロトコルは、キープアライブを使用する HTTP/1.1 です。

netstat による負荷テスト中に、新しいソケット接続が無差別に作成され、古い接続が TIME_WAIT になることが観察されました。


ログの抜粋:-

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "POST /INBOX/4504a09e-13c0-3853-a285-9e2b9a22f65e/1e1e5a20-a8c1-11e2-99b8-7c19e9129271 HTTP/1.1[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "Content-Type: application/json; charset=UTF-8[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "Content-Length: 117[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "Host: rwcdtgxb0402:15010[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "Connection: Keep-Alive[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "User-Agent: Apache-HttpClient/4.2.1 (java 1.5)[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - >> "[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - << "HTTP/1.1 200 OK[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - << "Content-Length: 0[\r][\n]"

[Worker-2] org.apache.http.impl.conn.Wire 63 - << "[\r][\n]"

[Worker-2] org.apache.http.impl.conn.DefaultClientConnection 254 - Receiving response: HTTP/1.1 200 OK

[Worker-2] org.apache.http.impl.conn.DefaultClientConnection 257 - << HTTP/1.1 200 OK

[Worker-2] org.apache.http.impl.conn.DefaultClientConnection 260 - << Content-Length: 0

[Worker-2] org.apache.http.impl.client.DefaultRequestDirector 540 - Connection can be kept alive indefinitely

**[Worker-2] org.apache.http.impl.conn.DefaultClientConnection 154 - Connection 0.0.0.0:51211<->192.168.88.172:15010 shut down**

[Worker-2] org.apache.http.impl.conn.BasicClientConnectionManager 189 - Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@12f65ce5

DefaultClientConnection.shutdown (接続 0.0.0.0:51210<->192.168.88.172:15010 シャットダウン) はクライアント側からの接続を閉じていますか? どのように呼び出されますか?サーバーからの応答 (200OK) を受信した後のコードでは、 httpPost.releaseConnection() はクライアント側のコードでのみ実行されます。

リクエストごとに接続を作成して TIME_WAIT に移行するのではなく、接続を ESTABLISHED 状態に維持して再利用するにはどうすればよいですか。

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

数日前に問題が解決しました。

間違い: HttpClient オブジェクトで releaseConnection() を呼び出しています。しかし、それを回避しても問題は解決しませんでした。

訂正: 接続を有効な状態 (ESTABLISHED 状態) に維持するためのアクションは、次のサンプル コードを介して行われました。

HttpClient client = new org.apache.http.impl.client.DefaultHttpClient();
...
org.apache.http.HttpResponse response = client.executed(HttpPost) ;
org.apache.http.HttpEntity en = response.getEntity();
if (en != null) {
  en.getContent().close();
}

HttpResponse を受信したら、作成した接続を再利用して維持するには、http 応答の InputStream (en.getContent()) のみを閉じる必要があります。HttpPost または Client オブジェクトで他のリリース メソッドを呼び出さないでください。

この処理を JMeter の負荷でテストしたところ、機能していることがわかりました。まだ副作用は観察されていません!

于 2013-05-07T07:09:10.487 に答える