±âŸ(framework)
2018.11.22 / 01:50
[java] HttpClientÀÇ Connection Pool ÀÌ¿ëÇÑ ¿ø°Ý È£Ãâ½Ã ¼ÒÄÏ¿¡·¯ ¹æÁö
hanulbit
Ãßõ ¼ö 268
HttpUrlConnection À̳ª HttpClient¸¦ ÀÌ¿ëÇؼ ¸¹À̵é URL ¿ø°Ý È£ÃâÀ» ÇÒÅÙµ¥
µ¿½Ã Á¢¼ÓÀÚ¼ö°¡ Á¶±Ý ¸¹Àº ¼ºñ½º¿¡ ÀÌ°É Àû¿ëÇÏ°Ô µÇ¸é
java.net.BindException: Address already in use: connect
java.net.SocketTimeoutException: connect timed out
ÀÌ¿Í °°Àº ¿¡·¯°¡ ³ª´Â°É º¼¼ö°¡ ÀÖ´Ù
ÀÚÁÖ ¹ß»ýÇÏÁö ¾ÊÁö¸¸ ÇÇÅ©½Ã°£¿¡ ¹®Á¦°¡ Ç×»ó ¹ß»ýµÇ¾ú´Ù
±×·¸´Ù¸é ¾î¶»°Ô ÇÏ¸é ¹®Á¦¸¦ ÇØ°áÇÒ¼ö ÀÖÀ»±î? BindExceptionÀº ´õÀÌ»ó ¿ ¼ÒÄÏÀÌ ¾ø¾î¼
³ª´Â ¿¡·¯ÀÌ°í HttpUrlConnection À̳ª HttpClient ¸ðµÎ È£ÃâÀÌ ÀÖÀ»¶§¸¶´Ù ¼ÒÄÏÀ» ¿°í ´Ý´Â°ÍÀ»
¹Ýº¹ÇÑ´Ù ±×·¸´Ù°í Çϸé Connection PoolÀ» ÀÌ¿ëÇÒ¼ö ¾øÀ»±î?
JDK API¸¦ ¾Æ¹«¸® µÚÁ®ºÁµµ Pool°ú °ü·ÃµÈ ¼Ò½º°¡ ¾ø¾ú°í ¾Æ³ö.. ÀÌ°É Á÷Á¢ ±¸ÇöÇÏ·Á°í ÇÏ´Ï
¸Ó¸®°¡ ³Ê¹«³ª ¾ÆÇÁ°í ±×·¡¼~~~ ¸ÚÁø jakarta project °¡¼ »ì¦ µÚÁ®º¸´Ï ½±°Ô ó¸®ÇÒ¼ö ÀÖ¾ú´Ù ^¤Ñ^
±âÁ¸ HttpUrlConnectionÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Â°É HttpClient·Î ¹Ù²Ù±â·Î °áÁ¤!
¸»Àº ÀÌÁ¦ ±×¸¸ÇÏ°í ¼Ò½º¸¦ º¸ÀÚ
¡Ø HttpClient´Â ¹öÁ¯º°·Î ¸ðµÎ ¼Ò½º°¡ ´Ù¸£±â ¶§¹®¿¡ googleÀ̳ª ´Ù¸¥ °Ë»ö¿£Áø¿¡¼ ±×³É º¸°í »ç¿ëÇϸé
¹öÁ¯¶§¹®¿¡ Á¦´ë·Î µ¿ÀÛÀ» ¾ÈÇÒ¼ö ÀÖÀ¸´Ï~ ²À API ¹®¼¸¦ º¸°í ¸¸µé±â¸¦ ±ÇÀå(ÀÌ°Å ¶§¹®¿¡ »ðÁúÁ»ÇÔ ¤Ð¤Ð)
¿¹Á¦ »ùÇÃÀº Æ©Å丮¾óÀ» º¸°í ÀÛ¼ºÇÑ°ÍÀÓÀ¸·Î ÀÌ»óÇÑ°Å ÀÖÀ½ ÇØ´ç »çÀÌÆ®¸¦ ÂüÁ¶ ÇÒ°Í!
------------------------------------------------------------------
---------------------------------------------------
ÃֽŠ¸±¸®Áö HttpClient 4.0.1 ±âÁØÀ¸·Î ÀÛ¼ºÇÔ
---------------------------------------------------------------------------------------------------------------------
/* Connection Pool ¼³Á¤ */
HttpParams params = new BasicHttpParams();
// Increase max total connection to 200
ConnManagerParams.setMaxTotalConnections(params, 200);
// Increase default max connection per route to 20
ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50);
ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(
new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
cm = new ThreadSafeClientConnManager(params, schemeRegistry);
/*
DefaultHttpClient ¿¡ ÆĶó¹ÌÅ͸¦ ¾î¶²°É ³Ñ°ÜÁֳĿ¡ µû¶ó
SingleClientConnManager ¿Í
ThreadSafeClientConnManager Áß ¹»¾²´ÂÁö °áÁ¤µÈ´Ù
ÀÚ¼¼ÇÑ°Ç API ÂüÁ¶
*/
httpClient = new DefaultHttpClient(cm, params);
ThreadSafeClientConnManager tm = (ThreadSafeClientConnManager)httpClient.getConnectionManager();
httpGet = new HttpGet("http://localhost/controller.jsp?Action=GetTopScore&GameIdx=1&Phone=111111109&Score=1213");
hr = httpClient.execute(httpGet);
entity = hr.getEntity();
if (entity != null) {
buff = new BufferedReader(new InputStreamReader(entity.getContent()));
while((line = buff.readLine()) != null)
{
if(!line.equals(""))
{
String[] my = line.split("\\|");
topPhonenum = Integer.parseInt(my[0]);
topScore = Integer.parseInt(my[1]);
}
}
}
br.close();
entity.consumeContent();
httpGet.abort();
---------------------------------------------------------------------------------------------------------------------
¾Æ¿ì ³Ê¹«³Ê¹« ±ÍÂú¾Æ~~~ ´ëÃæ ¼Ò½º¸¦ º¸¸é ¾Ë¼ö ÀÖÀ»°ÍÀ̶ó ÆÇ´ÜÇÏ°í Àüü ¼Ò½º´Â ¾È¿Ã¸®±â·Î ^^;;
À§¿¡ ¼Ò½º¸¸ º¸¸é ¾Æ ´ëÃæ
ThreadSafeClientConnManager À̶õ ³à¼ÆÀÌ ÀÖ±º¾Æ ¶ó°í »ý°¢ÀÌ µéÅ×°í
API ¹®¼¸¦ Á¶±Ý º¸´Ù º¸¸é HttpClient¿¡´Â ClientConnectionManager À̶ó´Â ÀÎÅÍÆäÀ̽º°¡ Á¸ÀçÇÏ°í
°ü·Ã Ŭ·¡½º·Î´Â SingleClientConnManager ¿Í
ThreadSafeClientConnManager °¡ Á¸ÀçÇÏ´Â°É ºÁ¼µµ
¾Æ...ÀÌ°Ô PoolÀ» ÀÌ¿ëÇÒ¶§¿Í ¾ÈÇÒ¶§ Â÷ÀÌÁ¡ÀÌ°Ú±º¾Æ ´ëÃæ °¨ÀÌ ¿ÀÁö ¾Ê´Â°¡?
´õ ±Ã±ÝÇϸé API¸¦ Á»´õ µÚÁ®º¸´ø°¡ °ü·Ã ¼Ò½º¸¦ ¿¿©º¸¸é ¾Ë¼ö ÀÖÀ»°Í~~!
¼³¸¶.... ¹«½¼¼Ò¸®ÀÎÁö ¸ð¸£°Ú´Ù..... ¶ó°í »ý°¢ÀÌ µé¸é ±×³É »ç¿ëÇÏ¸é µÊ -¤±-;;
ÀÚ ±×·³
ThreadSafeClientConnManager ¸¦ ÀÌ¿ëÇؼ PoolÀÇ ´ëÇÑ ¼³Á¤À» ÇÏ°í
HttpGetÀ» ÀÌ¿ëÇؼ ÇØ´ç URLÀ» È£ÃâÇÏ°í °á°ú°ªÀ» ¹Þ¾Ò´Ù
±×·¸´Ù¸é ÀÌ°É ¸Å¹ø °°Àº ÆäÀÌÁö¿¡¼ ¹Ýº¹ÇÒ°ÍÀΰ¡?
¾Æ½Ã´Ù½ÃÇÇ WEBÀ̶õ ȯ°æÀº µ¿ÀûÀÌÁö ¾Ê°í Á¤ÀûÀÎ ÆäÀÌÁö´Ù(¹°·Ð ¿¹¿Ü°¡ ÀÖÁö¸¸ ¸»ÀÌ´Ù)
Çѹø ÇØ´ç URLÀÌ È£ÃâµÇ°í °á°ú°¡ ȸ鿡 ³ª¿ÔÀ¸¸é ÇØ´ç ÆäÀÌÁö´Â ¸ØÃçÀÖ°í ¼¹ö´Â ¶Ç´Ù¸¥ ÀÛ¾÷À» ÇÏÁö ¾Ê´Â´Ù
±×·¸´Ù¸é ÇØ´ç URL¿¡¼ À§¿¡¼ ¾ð±ÞÇÑ HttpClient¸¦ ÀÌ¿ëÇؼ Connection PoolÀ» »ç¿ëÇÒ²¨¸é
ÇØ´ç °´Ã¼¸¦ ¸Þ¸ð¸®¿¡ °¡Áö°í ÀÖ¾î¾ß Çϴµ¥ ¾î¶»°Ô ÇؾßÇÒ±î?
¹æ¹ýÀº 2°¡Áö°¡ Àִµ¥(¹¹ ´Ù¸¥ ¹æ¹ýÀÌ ÀÖÀ»¼öµµ ÀÖ°ÚÁö¸¸ ^^;;;)
1. application º¯¼ö¿¡ ´ã¾Æ¼ ÇÊ¿äÇÒ¶§¸¶´Ù ²¨³»¾´´Ù
2. static class·Î ¸¸µé¾î¼ tomcat ±¸µ¿½Ã ¸Þ¸ð¸®¿¡ ¿Ã¶ó°¡µµ·Ï ÇÑ´Ù
¾î¶² ¹æ¹ýÀ» ÇÏ´ø ±×°Ç °³¹ßÀÚ°¡ ÆíÇÑ´ë·Î ÇÏ¸é µÇ´Ï±ñ~
°£´ÜÇÑ ¿¹Á¦ »ùÇÃÀ» ¸¸µé¾î¼ ¿Ã¸®°í ½ÍÁö¸¸ ³Ê¹«³ª Áö±Ý ¹è°¡ °íÇÁ°í ±ÍÂú±â ¶§¹®¿¡
´©±º°¡ ÇÊ¿äÇÏ´Ù°í Àý½ÇÈ÷ ¿äûÇϰųª ³»°¡ ÀÒ¾î¹ö¸®Áö ¾Ê°í ´Ù½Ã ÀÌÆ÷½ºÆÃÀ» ãÀ¸¸é ¼öÁ¤Çؾ߰ڴÙ;
±×·¡¼ °£´ÜÇÏ°Ô Á¤¸®¸¦ ÇÏÀÚ¸é
»ó¿ë¼ºñ½º¿¡¼ ¿ø°ÝÈ£ÃâÀ» ÀÌ¿ëÇÑ °³¹ßÀ» ÇÏ°í ½Í´Ù¸é HttpUrlConnection º¸´Ü HttpClientÀ» ÀÌ¿ëÇØ¾ß ¹Ù¶÷Á÷ÀÌ´Ù
HttpClient·Î ConnectionPool À» ±¸ÇöÇÒ¶§´Â application º¯¼ö³ª static class¸¦ ÀÌ¿ëÇÏ¿© °³¹ßÀ» ÇؾßÇÑ´Ù
±×·¡¾ß BindException ¿¡·¯¿¡ ´ëÇÑ ¹®Á¦µµ ÇØ°áÀÌ °¡´ÉÇÏ°í Connection Timeout ¹®Á¦µµ ÇØ°áÀÌ °¡´ÉÇÏ´Ù
(±×³É ¸Å¹ø È£Ãâ½Ã¿¡´Â °è¼Ó °´Ã¼¸¦ ¸¸µé¾ú´Ù°¡ ¾ø¾Ý´Ù°¡¸¦ ¹Ýº¹Çϱ⿡ PoolÀ» Àç»ç¿ëÇÏÁö ¾ÊÀ½)