Apache HttpResponse, HttpEntity 관련 주의 사항 Computer Code

Apache HttpComponent를 사용해서 HttpResponse를 처리할 때, HttpEntity는 반드시 처리해주어야 한다.
HTTP Request 요청만 보내고 Response를 처리할 필요가 없는 경우, 불필요하다 생각해서 Entity를 처리하지 않는 경우가 있는데 이런 사용법은 지양해야 한다.

아래와 같이 HttpClient, HttpContext 인스턴스를 재사용할 경우에는 반드시 response1의 entity를 처리해주어야 한다.
그렇지 않으면 다음 HTTP Request시에 Hang이 걸리는 문제에 맞닥뜨릴 수 있다. 

...
HttpGet httpget1 = new HttpGet(myUrl);
HttpResponse response1 = httpclient.execute(httpget1, httpcontext);

EntityUtils.consume(response1.getEntity()); // 필요함.

HttpGet httpget2 = new HttpGet(myUrl2);
HttpResponse response2 = httpclient.execute(httpget2, httpcontext);
...


HttpEntity는 내부에 열려진 스트림이 열린 상태로 존재하고, 스트림은 스트림 자체가 닫히지 않거나 ConnectionManager의 연결이 닫히지 않는 이상 계속 열려있게 된다. 이는 서버와의 연결도 계속 유지되고 있다는 뜻이고, 결국 서버당 연결 수 제한에 걸리면 추가 요청은 블럭될 수 밖에 없는 것이다. - 멀티스레드 상황에서는 더욱 주의해야 한다.

물론, HttpClient 를 재사용하지 않고 한 번만 HTTP Request를 호출하고 연결을 닫는 경우라면 특별히 문제될 것은 없지만, 그렇더라도 HttpEntity는 처리해주는 것이 바람직하다.

덧글

댓글 입력 영역