프로젝트 도중에 거래가 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;
}
'컴퓨터활용 > 자바' 카테고리의 다른 글
signapk 사용 (0) | 2014.10.21 |
---|---|
FTP FILE UPLOAD & DOWNLOAD Java EXAMPLE (1) | 2014.05.20 |
이클립스에서 한글 깨지는 파일 처리 (0) | 2013.12.29 |
텍스트 파일을 읽는 샘플 프로그램 (0) | 2013.07.17 |
키보드로 값을 입력받아서 출력 (0) | 2013.07.17 |