±âŸ(framework)
2018.11.22 / 01:51

HttpClient Connection Pooling

hanulbit
Ãßõ ¼ö 241
HttpClient·Î ºó¹øÈ÷ connectionÀ» ¸Î¾ú´Ù°¡, »ç¿ëÀÌ ³¡³ª¸é ²÷°í ÇÏ´Ù º¸¸é ´õ ÀÌ»ó connectionÀ» ¿­ ¼ö ¾ø´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
±× ÀÌÀ¯´Â connectionÀ» ´Ý´Â´Ù°í È£ÃâÀ» Çصµ, ½ÇÁ¦·Î´Â ¾î´À Á¤µµ TIME_WAIT »óÅ¿¡ ÀÖ´Ù°¡ ²÷¾îÁö´Âµ¥ ÀÌ·± °ÍµéÀÌ ¸¹ÀÌ ½×¿© ÀÖÀ¸¸é File Descriptor°¡ ²Ë á´Ù´Â ¿¡·¯(Too Many Open Files)°¡ ³ª¸é¼­ connectionÀ» ¸ÎÁö ¸ø ÇÏ°Ô µÈ´Ù.
ÀÌ·± Çö»óÀ» ¹æÁöÇϱâ À§Çؼ­´Â ConnectionÀ» Àç»ç¿ëÇÒ ¼ö ÀÖµµ·Ï HttpClient¿¡¼­ Á¦°øÇÏ´Â Connection PoolÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù.


<»ç¿ë ¶óÀ̺귯¸®>
httpclient-4.2.3.jar, httpcore-4.2.2.jar

public class ConnectionManager {

private static PoolingClientConnectionManager connectionManager = null;
public static synchronized HttpClient getHttpClient() {
if (connectionManager == null) {
connectionManager = new PoolingClientConnectionManager();
connectionManager.setMaxTotal(50);
connectionManager.setDefaultMaxPerRoute(20);
}

return new DefaultHttpClient(connectionManager);
}

public static void abort(HttpRequestBase httpRequest) {
if (httpRequest != null) {
try {
httpRequest.abort();
} catch (Exception e) {}
}
}

public static void release(HttpResponse response) {
if (response != null && response.getEntity() != null)
EntityUtils.consumeQuietly(response.getEntity());
}
}


¿ä·± ½ÄÀ¸·Î, staticÀ¸·Î PoolingClientConnectionManager ¸¦ Çϳª ¼±¾ðÇØ µÎ°í, ÃÖÃÊ·Î getHttpClient¸¦ È£ÃâÇÒ ¶§ Connection PoolÀÌ ÁöÁ¤µÈ »çÀÌÁî·Î »ý¼ºµÈ´Ù. ±×¸®°í, ConnectionÀ» Çϳª ¸¸µé¾î ¸®ÅÏÇÑ´Ù.

- maxTotal : Connection PoolÀÇ ¼ö¿ë °¡´ÉÇÑ ÃÖ´ë »çÀÌÁî
- defaultMaxPerRoute : °¢ host(IP¿Í PortÀÇ Á¶ÇÕ)´ç Connection Pool¿¡ »ý¼º°¡´ÉÇÑ Connection ¼ö


protected <T> T get(String url) {
HttpClient httpClient = null;
HttpGet httpGet = null;
HttpResponse response = null;
try {
httpClient = ConnectionManager.getHttpClient();
httpGet = new HttpGet(url);
response = httpClient.execute(httpGet);

StatusLine statusLine = response.getStatusLine();
// ¿¡·¯ ¹ß»ý
if (statusLine.getStatusCode() < 200 || statusLine.getStatusCode() >= 300) {
throw new Exception(statusLine.getStatusCode(), getReason(response));
}
// ¼º°ø
else {
                            // do something
}
} catch (ClientProtocolException e) {
e.printStackTrace();
ConnectionManager.abort(httpGet);
throw e;
} catch (IOException e) {
e.printStackTrace();
ConnectionManager.abort(httpGet);
throw e;
} finally {
ConnectionManager.release(response);
}
}

Connection PoolÀº ¿ä·± ½ÄÀ¸·Î ÀÌ¿ëÇÏ¸é µÇ°Ú´Ù. À§´Â GET ¹æ½Ä »ç¿ë½Ã.


PoolÀ» »ç¿ëÇÒ ¶§¸¶´Ù Ç×»ó ÁÖÀÇÇÒ °ÍÀº ¿ª½Ã ¹ÝȯÀ» ²À ÇØ Áà¾ß ÇÑ´Ù´Â °Í!!!
ExceptionÀÌ ¹ß»ýÇϸé abort¸¦ È£ÃâÇؼ­ Á¤¸®ÇØ ÁÖ°í, finally¿¡¼± Ç×»ó EntityUtils.consumeQuietly¸¦ È£ÃâÇؼ­ ¸®¼Ò½º¸¦ ¹Ý³³ÇÏ°Ô ÇØ ÁØ´Ù.