Httpclient 4.0.3 随机挂起的多个帖子

2024-01-07

让我解释一下情况。

我有一个 servlet 将传出 GET/POST 重定向到另一个域(某种代理)上的另一个项目,其工作是处理它并返回一些内容(参数和 gif)。我使用 HttpClient 4.0.3 来执行此操作。

我的应用程序在启动时发送了多个 GET/POST,因此我设置了一次 ThreadSafeClientConnManager 来以这种方式处理多个线程。

cm_params = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(cm_params, 200);

ConnPerRouteBean connPerRoute = new ConnPerRouteBean();
HttpHost localhost = new HttpHost("localhost");
connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);

ConnManagerParams.setMaxConnectionsPerRoute(cm_params, connPerRoute);

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
        new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

cm = new ThreadSafeClientConnManager(cm_params, schemeRegistry);

然后我使用这些参数创建一个新的 HttpClient,这应该足以同时处理一堆请求。当然,我这样做是在公共无效服务()对于每个 GET/POST 但我在创建它后使用相同的 Httpclient 对象。

httpclient = new DefaultHttpClient(cm, cm_params);

之后,我构建我的 POST 并通过执行发送它,并包含所有必需的参数和这样的三重验证。

    HttpPost httpPost = new HttpPost(target+tmpString); 

    httpPost.setHeader("Host", request.getHeader("host"));
    httpPost.setHeader("User-Agent", request.getHeader("user-agent"));
    httpPost.setHeader("Accept-Encoding", request.getHeader("accept-encoding"));
    httpPost.setHeader("Accept", request.getHeader("accept"));
    ..etc..

    UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(params);
    urlEncodedFormEntity.setContentEncoding(HTTP.UTF_8);
    httpPost.setEntity(urlEncodedFormEntity);

    HttpResponse response = httpclient.execute(httpPost);

最后我读取了流并处理了实体......

    OutputStream os = res.getOutputStream();
    InputStream is = response.getEntity().getContent();
    byte[] buf = new byte[1024];
    for(int n;(n=is.read(buf))!=-1;)
    {
        os.write(buf, 0, n);
    }
    // Make sure to close
    is.close();
    os.close();

    // Flush entities just in case
    EntityUtils.consume(urlEncodedFormEntity);
    EntityUtils.consume(response.getEntity());
    urlEncodedFormEntity.getContent().close();
    response.getEntity().getContent().close();

所以我的问题是,当我加载页面时,代码运行得很好。已正确处理 4 个发送的请求(1 个 GET、3 个 POST)。基本上返回一些参数和 1 个我在页面上打印的小 gif。

但当我开始对我的应用程序进行压力测试时,I.E.在 4-5 个选项卡中加载同一页面,每当我同时执行多个 POST 时,我的应用程序似乎都会随机挂起。我以为即使我使用它也不会有任何问题相同的 Httpclient 对象因为我正确地声明了 ThreadSafeClientConnManager (我认为?),所以它应该处理多个线程。

有人知道我做错了什么吗?如果我一一加载我的选项卡,它不会挂起。就在我同时刷新多个选项卡时。

有人知道吗? :S(抱歉英语不是我的母语^^;)


@Apache Fan,设置这个:

ConnManagerParams.setMaxTotalConnections(cm_params, 200); connPerRoute.setDefaultMaxPerRoute(50);

怀疑我可能会耗尽连接,我打开 3-4 个选项卡,它就耗尽了...每个选项卡可能有 4 个 POST,所以不会加起来:S

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Httpclient 4.0.3 随机挂起的多个帖子 的相关文章

随机推荐