讓我解釋一下情況。用Httpclient 4.0.3隨機掛多帖
我有一個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與這些參數,這應該足以處理一堆請求在同一時間。當然,我對public void service()對每個GET/POST都這樣做,但是我在創建它之後使用了相同的HttpClient對象。
httpclient = new DefaultHttpClient(cm, cm_params);
之後,我建立我的POST並通過執行發送它,所有requiered參數和這樣的三重驗證。
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)正確處理。基本上返回一些params和我在我的頁面上打印的一個小gif。
但是,一旦我開始壓力測試我的應用程序,即在4-5個選項卡中加載相同的頁面,我的應用程序似乎隨機掛起,每當我在同一時間執行多個POST。我想即使我使用相同的HttpClient對象因爲我正確地宣佈我的ThreadSafeClientConnManager(我想?)我不會有任何問題,所以它應該處理多個線程。
任何人都知道我在做什麼錯了?如果我加1我的標籤1,它不掛。正當我同時刷新多個標籤時。
任何有線索? :S(SRY英語的心不是我的第一語言^^;)
這很好地解決了我有一個非常類似的症狀的問題。 – 2012-09-26 16:30:03