상황을 설명하겠습니다.Httpclient 4.0.3을 여러 번 게시하여 임의로 매달려
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);
그때 나는 동시에 요구의 무리를 처리 할 수있을만큼해야하는 PARAMS와 HttpClient를 새로운을 만들 수 있습니다. 물론 G30/POST마다
public void service()이 있지만 동일한 Httpclient 객체를 사용합니다.
httpclient = new DefaultHttpClient(cm, cm_params);
그 후 나는 내 POST를 구축하고 모든 requiered 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)이 올바르게 처리되었습니다. 기본적으로 내 페이지에 인쇄하는 일부 매개 변수와 1 개의 작은 GIF를 반환합니다.
하지만 곧 내 앱 스트레스 테스트를 시작합니다. 동일한 페이지를 4-5 개의 탭에로드하면 동시에 여러 POST를 실행할 때마다 내 앱이 무작위로 멈춘 것처럼 보입니다. 나는 내 ThreadSafeClientConnManager를 올바르게 선언 했으므로과 동일한 Httpclient 객체 인 을 사용한다고해도 아무런 문제가 없다고 생각했습니다. 그래서 여러 스레드를 처리해야합니다.
누구나 내가 뭘 잘못하고 있는지 알아? 탭을 1 씩로드하면 멈추지 않습니다. 동시에 하나 이상의 탭을 새로 고칠 때.
누구나 단서가 있습니까? : S (SRY 영어 밤은 내 첫 번째 언어를 ^^;) 당신은 HttpClient API에서이를 확인하시기 바랍니다
이것은 매우 비슷한 일련의 증상을 가지고있는 문제를 해결하는 데 효과적이었습니다. –