让我解释一下情况。
我有一个servlet将传出GET/POST重定向到另一个域(某种代理)上的另一个项目,其任务是处理它并返回一些东西(params和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);在那之后,我建立了我的帖子,并通过执行发送它,与所有的请求对和这样的三重验证。
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)正确处理。基本地返回一些参数和一个小礼物,我打印在我的网页上。
但是,当我开始压力测试我的应用程序,即在4-5标签中加载相同的页面时,每当我同时执行多个帖子时,我的应用程序似乎就会随机挂起。我想即使我使用相同的Httpclient对象,也不会有任何问题,因为我正确地声明了自己的ThreadSafeClientConnManager (我认为?)所以它应该处理多个线程。
有人知道我做错了什么吗?如果我加载我的标签1乘1,它不会挂。当我同时刷新超过一个选项卡时。
谁有线索?:S (sry english不是我的第一语言^;)
发布于 2011-01-18 14:15:18
@Apache扇,设置如下:
ConnManagerParams.setMaxTotalConnections(cm_params,200);connPerRoute.setDefaultMaxPerRoute(50);
怀疑我无法连接,我打开3-4选项卡它就用完了.每个标签上大概有4个帖子,所以不加起来:S
发布于 2011-01-14 21:26:46
你可能想从HttpClient API上看看这个-
ThreadSafeClientConnManager在每个路由的基础上并在总体上保持连接的最大限制。默认情况下,该实现将在每个给定路由中创建不超过2个并发连接,并且总共不会创建超过20个连接。对于许多实际应用程序来说,这些限制可能过于限制,特别是如果它们使用HTTP作为其服务的传输协议。但是,可以使用HTTP参数来调整连接限制。
可能您的应用程序正在耗尽池连接,您需要增加池大小。
发布于 2014-03-08 16:39:55
最近我试图做到这一点,但是我遇到了一些新的问题,比如当我第一次发送请求时,它没有cookie,但是在第二次,httpContext是自动添加cookie的,但是这是标准的发送方式,但是有时您的请求服务器接受没有cookie,所以我使用了拦截器。在第二次删除自动添加的cookie之后,它运行良好,请使用这个httpClient拦截器,使用下面的代码:
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");
}
}); https://stackoverflow.com/questions/4694419
复制相似问题