首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Httpclient 4.0.3随机悬挂的多个post

Httpclient 4.0.3随机悬挂的多个post
EN

Stack Overflow用户
提问于 2011-01-14 18:13:04
回答 4查看 4.5K关注 0票数 4

让我解释一下情况。

我有一个servlet将传出GET/POST重定向到另一个域(某种代理)上的另一个项目,其任务是处理它并返回一些东西(params和gif)。我使用HttpClient 4.0.3来完成这个任务。

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

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
httpclient = new DefaultHttpClient(cm, cm_params);

在那之后,我建立了我的帖子,并通过执行发送它,与所有的请求对和这样的三重验证。

代码语言:javascript
复制
    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);

最后我读了流并处理了这些实体..。

代码语言:javascript
复制
    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)正确处理。基本地返回一些参数和一个小礼物,我打印在我的网页上。

但是,当我开始压力测试我的应用程序,即在4-5标签中加载相同的页面时,每当我同时执行多个帖子时,我的应用程序似乎就会随机挂起。我想即使我使用相同的Httpclient对象,也不会有任何问题,因为我正确地声明了自己的ThreadSafeClientConnManager (我认为?)所以它应该处理多个线程。

有人知道我做错了什么吗?如果我加载我的标签1乘1,它不会挂。当我同时刷新超过一个选项卡时。

谁有线索?:S (sry english不是我的第一语言^;)

EN

回答 4

Stack Overflow用户

发布于 2011-01-18 14:15:18

@Apache扇,设置如下:

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

怀疑我无法连接,我打开3-4选项卡它就用完了.每个标签上大概有4个帖子,所以不加起来:S

票数 3
EN

Stack Overflow用户

发布于 2011-01-14 21:26:46

你可能想从HttpClient API上看看这个-

ThreadSafeClientConnManager在每个路由的基础上并在总体上保持连接的最大限制。默认情况下,该实现将在每个给定路由中创建不超过2个并发连接,并且总共不会创建超过20个连接。对于许多实际应用程序来说,这些限制可能过于限制,特别是如果它们使用HTTP作为其服务的传输协议。但是,可以使用HTTP参数来调整连接限制。

可能您的应用程序正在耗尽池连接,您需要增加池大小。

票数 2
EN

Stack Overflow用户

发布于 2014-03-08 16:39:55

最近我试图做到这一点,但是我遇到了一些新的问题,比如当我第一次发送请求时,它没有cookie,但是在第二次,httpContext是自动添加cookie的,但是这是标准的发送方式,但是有时您的请求服务器接受没有cookie,所以我使用了拦截器。在第二次删除自动添加的cookie之后,它运行良好,请使用这个httpClient拦截器,使用下面的代码:

代码语言:javascript
复制
httpClient.addRequestInterceptor(new HttpRequestInterceptor() {

        @Override
        public void process(HttpRequest request, HttpContext context)
                throws HttpException, IOException {
            LOG.info("***************** Entered My Interceptor ****************************");
            Header[] headers = request.getAllHeaders();
            for (Header eachHeader : headers) {
                LOG.info("Headers -- Name: {}, Value: {} ",
                        eachHeader.getName(), eachHeader.getValue());
            }
            request.removeHeaders("Cookie");
        }
    }); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4694419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档