0

その結果、サーバー リクエストを送信するコードを記述する必要があります。リクエストは 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 を使用した例を見つけるのは困難です。

ありがとう

4

0 に答える 0