2014-10-08 3 views
0

정의에 따르면 PoolingHttpClientConnectionManager는 연결을 다시 사용합니다. 그렇다면PoolingHttpClientConnectionManager를 사용할 때 연결을 해제해야합니다.

1) 연결을 명시 적으로 해제 할 필요가 없습니다.

2) 관리자가 해제해도 연결을 다시 사용할 수 없습니까?

executing a method? 

CloseableHttpClient closableHttpClient = HttpClients.custom().setConnectionManager(getPoolingHttpClientConnectionManager()).build(); 
     HttpPost post = new HttpPost(resourcePath);      
       try { 
        return closableHttpClient.execute(post); 

       } catch (IOException e) { 
        //handle exception 
       }finally { 
        post.releaseConnection(); 
       } 
+2

'CloseableHttpReponse'를 닫으면 연결이 닫힙니다. 당신이하려고 시도 할 수도 있습니다 (귀하의 이전 게시물을 기반으로) mutlithreaded 방식으로 풀링을 실행합니다. 다른 예제와 함께 [** Threaded Request Execution example **] (https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientMultiThreadedExecution.java)를 참조하십시오. [** 여기 **] (https://hc.apache.org/httpcomponents-client-ga/examples.html)를 찾았습니다. 또한 더 많은 설명이 발견되었습니다. ** ** 섹션 2.4 **에 있습니다. (https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e380) –

답변

1

(1)입니다. 연결 관리자는 응용 프로그램 계층이 임대 연결에서 읽기를 완료했는지 여부를 알 수 없습니다. 따라서 명시 적으로 관리자에게 다시 릴리스해야합니다.

(2) 연결을 다시 사용할 수 있는지 여부는 여러 가지 요인에 따라 달라집니다. 응답 메시지를 완전히 소비해야하며 양측 (클라이언트 및 서버)이 자신의 신호를 보내야합니다. 의도가 살아 연결을 유지하기 위해, 어떤 I/O 오류 등

+0

https : //hc.apache. org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientConnectionRelease.java는 inputstream을 닫 자마자 연결이 풀로 다시 해제된다고 말합니다. 어떤 사람들은 response.close()에서 풀 었다고 주석을 달았으며, 많은 예제들이이를 지원합니다. 하지만 HttpResponseProxy.close()의 javadocs에서는 "연결 유지 옵션을 사용하지 않고 연결을 해제합니다. 이것은 연결 종료를 의미하는 하드 릴리스입니다. 우아한 릴리스에는 releaseConnection()을 사용하십시오." 무엇이 옳은지 확인하기위한 가치있는 참고 자료가 있습니까? –

+0

두 문장 모두 정확합니다. CloseableHttpResponse # close에 대한 호출에 응답 엔터티가 완전히 사용 된 경우 기본 연결은 일관되고 재사용 가능한 상태로 연결 관리자에게 다시 반환됩니다. 이후의 #close 호출은 아무 효과가 없습니다. – oleg

+0

HttpResponseProxy.close() 코드가 this.connHolder.abortConnection()을 호출하면 (this.connHolder! = null)이 확인은 connHolder가 close를 호출하기 전에 null이 될 수 있도록 보장합니다. 응답 엔터티 완전히 소모 되었습니까? 또한이 트리거가 입력 스트림 종료시에 발생하는 클래스로 안내해 주시겠습니까? –

1

일반적인 사용 사례는 없다 : 그것은

CloseableHttpClient closableHttpClient = HttpClients.custom().setConnectionManager(getPoolingHttpClientConnectionManager()).build(); 
HttpGet httpget = new HttpGet("http://localhost/"); 
CloseableHttpResponse response = httpclient.execute(httpget); 
try { 
    HttpEntity entity = response.getEntity(); 
    if (entity != null) { 
     InputStream instream = entity.getContent(); 
     try { 
      // do something useful 
     } finally { 
      instream.close(); 
     } 
    } 
} finally { 
    response.close(); 
} 
  1. 입니다. instream.close()response.close()은 명시 적으로 기본 연결을 트리거합니다. 이른바 release는 소켓을 직접 닫지 않습니다. 그것은 몇 가지 사실을 확인합니다 : 스트림이 연결이 다시 설정되어있는 경우 2) 3)의 경우 살아

  2. closableHttpClient.close 유지와 피어 서버 응답()이 종료됩니다 소비 가득 경우 1)을 연결 풀

관련 문제