gpt4 book ai didi

java - Httpclient 4.0.3 随机挂起的多个帖子

转载 作者:搜寻专家 更新时间:2023-11-01 02:33:05 28 4
gpt4 key购买 nike

让我解释一下情况。

我有一个 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,它应该足以同时处理一堆请求。当然,我在 public void service() 上为每个 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

关于java - Httpclient 4.0.3 随机挂起的多个帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4694419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com