その結果、サーバー リクエストを送信するコードを記述する必要があります。リクエストは xml 形式の文字列です。調査を行った後、複数のスレッドと接続プール マネージャーを使用して要求と応答を処理することにしました。PoolingHttpClientConnectionManager、httpclient 4.3 バージョンを使用します。1 つのスレッドを使用すると、コードが機能し、要求を送信して応答を取得します。しかし、複数のスレッドとして作成し、単一の httpclient を使用すると、接続が壊れているように見えます。netstat を使用して、TCP ステータスが TIME_WAIT であることを確認します。私のコードは次のようなものです:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);
cm.setDefaultMaxPerRoute(10);
cm.setMaxPerRoute(new HttpRoute(new HttpHost(ENV_ ABCD)), 20);
CloseableHttpClient httpclient = HttpCleints.custom().setConnectionManager(cm).build();
私もスレッドプールを使用します。各スレッドは1つのタスク(実行可能)を処理するために使用されます。このタスクには、1 つの要求の生成、サーバーへの要求の送信、および応答の取得と処理が含まれます。このタスクが完了すると、スレッドはスレッド プールに戻され、接続も接続プールに戻されます。
これまでのところ、すべてのリクエストは同じサーバーに送信されています。
実行可能なタスクには、次の行コードが含まれます。
HttpPost post = new HttpPost(url);
try {
// the request is xml string
post.setEntity(new StringEntity(request));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String responseStr = null;
try {
// the commonHttpClient is same instance of httpclient declared above.
HttpResponse response = commonHttpClient.execute(post);
HttpEntity entity = response.getEntity();
if (entity != null){
responseStr = getString(entity.getContent());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
応答がありません。「commonHttpClient.execute(post);」の行にコードがぶら下がっていることがわかります。netstat から、クライアント側が接続を閉じていることがわかります。
スレッドが 1 つしかない場合、この問題は発生しません。私のコードのどの部分が間違っているか教えてください。接続を構成する手順を見逃していませんか? Apache httpclient 4.3 を使用した例を見つけるのは困難です。
ありがとう