컴퓨터활용/자바

HttpURLConnection 할 때 setConnectTimeout 해 줘야 함

멜번초이 2013. 12. 30. 20:57
반응형

 

프로젝트 도중에 거래가 hang 걸리는 현상이 발생되어서 당황했다. 원인을 분석해 본 결과 소켓 통신하는 루틴에서 상대방 서버의 사정으로 접속이 지연될 때 timeout 처리가 제대로 되지 않아서 발생되었다. 처음에는 DB 쪽 lock 인 줄 알고 transaction 처리를 잘못 해서 나는 것으로 보고 접근했으나 원인은 엉뚱한데 있었던 것이다.

 

그래서 urlConnection.setConnectTimeout(); 메소드에 1초로 세트했다.  그랬더니 바로 지연 없이 exception 으로 떨어졌다. 자라보고 놀란 가슴 솥뚜껑 보고 놀란다고 하는 김에 readTimeout 도 아래와 같이 설정했다.               urlConnection.setReadTimeout(TIMEOUT_VALUE);

이 때 설정하는 시간은 millisecond 인데 1000 millisecond 가 1초이다.

 

       /*

        * 지정된 URL 로 데이타를 전송한다 

        *

        */

       private  void sendDataByHttp(Map<String, String> inputMap)  {

            

             DataInputStream dis = null;

             DataOutputStream dout = null;

            

             String param = "";

            

             URL url = null;

             HttpURLConnection urlConnection = null;

             int TIMEOUT_VALUE = 1000;   // 1

 

             // 입력값을 URL 로 전환

             param = mapToUrl(inputMap);

            

             try{

 

                    url = new URL(sUrl);

                   

                    urlConnection = (HttpURLConnection)url.openConnection();

                    urlConnection.setConnectTimeout(TIMEOUT_VALUE);

                    urlConnection.setReadTimeout(TIMEOUT_VALUE);

                    urlConnection.setRequestMethod("POST");

                    urlConnection.setDoOutput(true);

                   

                    dout = new DataOutputStream(urlConnection.getOutputStream());

                    dout.write(param.getBytes());

                   

                    if( urlConnection.getResponseCode()== HttpURLConnection.HTTP_OK) {

                           dis= new DataInputStream(urlConnection.getInputStream());

                   } 

 

                   

             }catch(Exception e){

                    e.printStackTrace();

                    if(logger.isDebugEnabled()) logger.debug("#### error #### = {}", e.toString());

             }finally{

                    urlConnection.disconnect();

             }

 

       }

 

 

참고로 

 

       /*

        * MAP정보를 이용해서 URL 을 구성한다

        */

       private static String mapToUrl(Map<String, String> InMap){

            

             Map<String, String> inParamMap = InMap;

             Set<String>         set       = inParamMap.keySet();

             Iterator<String>    iter      = set.iterator();

             String              param     = "";

             String              key       = "";

 

             while(iter.hasNext()){

                    key = iter.next();

                    if(param.length()==0){

                           param = "?"+key +"=" +inParamMap.get(key);

                    }else{

                           param += "&"+key +"=" +inParamMap.get(key);

                    }

             }

             return param;

       }

 

 

 

반응형