2011-01-14 2 views
4

상황을 설명하겠습니다.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에서이를 확인하시기 바랍니다

답변

2

-

ThreadSafeClientConnManager는 노선으로 당에서의 연결의 최대 한도를 유지 합계. 디폴트에서는,이 구현은 지정된 라우트 당 2 개 이하의 동시 접속을 작성해, 합계로 20 개의 접속을 작성하지 않습니다. 많은 실제 응용 프로그램에서 이러한 제한은 특히 HTTP를 서비스 용 전송 프로토콜로 사용하는 경우 너무 제한적일 수 있습니다. 그러나 연결 제한은 HTTP 매개 변수를 사용하여 조정할 수 있습니다.

애플리케이션에 풀링 된 연결이 부족하여 풀 크기를 늘려야 할 수도 있습니다. 이 설정

3

@Apache 팬 :

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

의심 할 여지없이 연결이 끊어져 3-4 탭이 열리면 ...theres 어쩌면 4 탭에 추가 할 수 있도록 그 탭 : S

+0

이것은 매우 비슷한 일련의 증상을 가지고있는 문제를 해결하는 데 효과적이었습니다. –

0

최근에 내가 이걸 시도하고 있었지만 처음으로 내가 쿠키를 보내지 않고 요청을 보낼 때와 같은 새로운 문제가 생겼다.하지만 두 번째로 httpContext는 자동으로 쿠키를 추가합니다. 하지만이 방법은 표준으로 보내지 만 때로는 요청한 서버가 쿠키없이 허용하기 때문에 INTERCEPTOR를 사용했습니다. 저도 같은 오류로 붙어있어

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

: 두 번째 시간에 그것은 일하는 그 후 자동 미세 코드 아래에이 httpClient 인터셉터 사용을 이용하시기 바랍니다 쿠키를 추가 한 제거합니다. 우리가 알아 차린 것은 HttpClient가 스스로를 닫지 않는다는 것입니다.

내가 한 것은 내 HttpClientUtils.closeQuietly() 메서드를 내 HttpClient 및 HttpResponse에서 시도한 것이고, 그 원인을 찾았으며 더 이상 멈추지 않았습니다. 또한 시도해 볼 수 있습니다.