httpClient连接在多线程代码中处于time_wait状态

时间:2013-10-07 16:29:21

标签: apache-httpclient-4.x

我需要编写一个代码来发送服务器请求,请求是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();

我也使用线程池,每个线程用于处理一个任务(runnable)。该任务包括生成一个请求,将请求发送到服务器以及获取和处理响应,一旦此任务完成,该线程就会被放回线程池,并且连接也会被放回连接池。

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

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

    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很难找到这个例子。

由于

0 个答案:

没有答案