0

因此,我需要编写代码来发送服务器请求,请求是 xml 格式的字符串。经过研究,我选择使用多线程和连接池管理器来处理请求和响应。我使用的是 PoolingHttpClientConnectionManager,httpclient 4.3 版本。当我使用一个线程时,代码工作,发送请求并获得响应。但是当我将它作为多线程并使用单个 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();

我也使用线程池,每个线程用于处理一个任务(可运行)。该任务包括生成一个请求、向服务器发送请求以及获取和处理响应,一旦该任务完成,线程被放回线程池,连接也被放回连接池。

到目前为止,所有请求都发送到同一台服务器。

可运行任务包括以下行代码:

    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 中,它告诉客户端正在关闭连接。

如果只有一个线程,我没有这个问题。谁能告诉我我的代码的哪一部分是错误的。我错过了配置连接的任何步骤吗?很难找到使用 apache httpclient 4.3 的示例。

谢谢

4

0 回答 0