Apache HttpClient API에서 CloseableHttpClient와 HttpClient의 차이점은 무엇입니까?
우리 회사에서 개발 한 애플리케이션을 연구 중입니다. Apache HttpClient 라이브러리를 사용합니다. 소스 코드에서는 HttpClient
클래스를 사용하여 서버에 연결할 인스턴스를 만듭니다.
Apache HttpClient에 대해 배우고 싶고이 예제 세트를 살펴 보았습니다 . 모든 예제는 CloseableHttpClient
대신 HttpClient
. 내가 생각하는 그래서 것은 CloseableHttpClient
의 확장 버전입니다 HttpClient
. 이 경우 두 가지 질문이 있습니다.
- 이 둘의 차이점은 무엇입니까?
- 새로운 개발에 어떤 클래스를 사용하는 것이 좋습니까?
- HttpClient API의 주요 진입 점은 HttpClient 인터페이스입니다.
- HttpClient의 가장 중요한 기능은 HTTP 메서드를 실행하는 것입니다.
- HTTP 메서드 실행에는 일반적으로 HttpClient에 의해 내부적으로 처리되는 하나 이상의 HTTP 요청 / HTTP 응답 교환이 포함됩니다.
- CloseableHttpClient는 java.io.Closeable을 구현하는 HttpClient의 기본 구현 인 추상 클래스입니다.
다음은 가장 간단한 형태의 요청 실행 프로세스의 예입니다.
CloseableHttpClient httpclient = HttpClients.createDefault (); HttpGet httpget = new HttpGet ( "http : // localhost /"); CloseableHttpResponse 응답 = httpclient.execute (httpget); { // 무언가 } 드디어 { response.close (); }
HttpClient 리소스 할당 취소 : CloseableHttpClient 인스턴스가 더 이상 필요하지 않고 범위를 벗어나려는 경우 CloseableHttpClient # close () 메서드를 호출하여 연결된 연결 관리자를 종료해야합니다.
CloseableHttpClient httpclient = HttpClients.createDefault (); { // 무언가 } 드디어 { httpclient.close (); }
@Scadge Java 7부터 try-with-resources 문을 사용하면 문 끝에서 각 리소스가 닫힙니다.
try(CloseableHttpClient httpclient = HttpClients.createDefault()){
//do something with httpclient here
}
같은 질문을했습니다. 다른 답변은 close ()가 정말로 필요한 이유를 다루지 않는 것 같습니다. 또한 Op는 HttpClient 등으로 작업하는 데 선호되는 방법을 파악하는 데 어려움을 겪고있는 것 같습니다.
Apache 에 따르면 :
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.
또한 관계는 다음과 같이 진행됩니다.
HttpClient
(상호 작용)구현 :
CloseableHttpClient
-ThreadSafe.
DefaultHttpClient
- 스레드하지만 사용되지는 사용HttpClientBuilder
대신.
HttpClientBuilder
-ThreadSafe는 아니지만 ThreadSafe를 만듭니다CloseableHttpClient
.
- CUSTOM을 만드는 데 사용합니다
CloseableHttpClient
.
HttpClients
-ThreadSafe는 아니지만 ThreadSafe를 만듭니다CloseableHttpClient
.
- DEFAULT 또는 MINIMAL을 만드는 데 사용합니다
CloseableHttpClient
.
Apache에 따른 선호하는 방법 :
CloseableHttpClient httpclient = HttpClients.createDefault();
그들이 제공 하는 예httpclient.close()
는 finally
절에서 수행되며 또한 사용 ResponseHandler
합니다.
대안으로 mkyong이하는 방식은 약간 흥미 롭습니다.
HttpClient client = HttpClientBuilder.create().build();
그는 client.close()
전화를 표시하지 않지만 client
여전히의 인스턴스 이기 때문에 필요하다고 생각합니다 CloseableHttpClient
.
다른 답변은 왜 close()
정말 필요한지 설명하지 않는 것 같습니다 . * 2
"HttpClient 리소스 할당 해제"에 대한 대답에 의문을 제기하십시오.
오래 전 3.x httpcomponents doc 에서 언급되었으며 4.x HC와 많은 차이가 있습니다. 게다가 설명이 너무 짧아서이 기본 리소스가 무엇인지 말하지 않습니다.
I did some research on 4.5.2 release source code, found the implementations of CloseableHttpClient:close()
basically only closes its connection manager.
(FYI) That's why when you use a shared PoolingClientConnectionManager
and call client close()
, exception java.lang.IllegalStateException: Connection pool shut down
will occur. To avoid, setConnectionManagerShared
works.
I prefer not do CloseableHttpClient:close()
after every single request
I used to create a new http client instance when doing request and finally close it. In this case, it'd better not to call close()
. Since, if connection manager doesn't have "shared" flag, it'll be shutdown, which is too expensive for a single request.
In fact, I also found in library clj-http, a Clojure wrapper over Apache HC 4.5, doesn't call close()
at all. See func request
in file core.clj
In the next major version of the library HttpClient
interface is going to extend Closeable
. Until then it is recommended to use CloseableHttpClient
if compatibility with earlier 4.x versions (4.0, 4.1 and 4.2) is not required.
HttpClient
is not a class, it is an interface. You cannot use it for development in the way you mean.
What you want is a class that implements the HttpClient
interface, and that is CloseableHttpClient
.
CloseableHttpClient
is the base class of the httpclient library, the one all implementations use. Other subclasses are for the most part deprecated.
The HttpClient
is an interface for this class and other classes.
You should then use the CloseableHttpClient
in your code, and create it using the HttpClientBuilder
. If you need to wrap the client to add specific behaviour you should use request and response interceptors instead of wrapping with the HttpClient
.
This answer was given in the context of httpclient-4.3.
'code' 카테고리의 다른 글
파이썬 부동에서 정수로 변환 (0) | 2020.11.27 |
---|---|
DataTables 경고 : '0'행의 데이터 소스에서 알 수없는 매개 변수 '0'을 요청했습니다. (0) | 2020.11.27 |
NLog 항목을 vs2008 '출력'창에 어떻게 출력 할 수 있습니까? (0) | 2020.11.27 |
키 / 값 쌍 개체에 항목을 삽입하는 방법은 무엇입니까? (0) | 2020.11.27 |
자식 리베이스 병합 충돌 (0) | 2020.11.27 |