달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 7. 22. 09:47

eclipse breakpoint에 condition 설정하기 그거/Java2010. 7. 22. 09:47



1. editor 에서 breakpoint 를 설정한다.




2. 설정한 breakpoint에서 마우스 오른쪽 버튼을 클릭하여 "Breakpoint Properties" 를 선택한다.




3. Enabled Condition 을 체크하고 입력창에 condition 을 입력한다.


'그거 > Java' 카테고리의 다른 글

JSP 요약  (0) 2010.10.22
PMD report 파일의 한글 문제  (0) 2010.10.01
Visual VM을 이용해서 모니터링하기~  (0) 2010.03.05
properties 파일 로딩하기  (0) 2010.02.19
정규표현식을 이용해서 img 태그의 src 추출하기~  (2) 2010.02.08
:
Posted by 뽀기
2010. 3. 5. 17:38

Visual VM을 이용해서 모니터링하기~ 그거/Java2010. 3. 5. 17:38


JDK 1.6.0.18을 설치하면..Visual VM 이라는 모니터링 툴이 같이 설치가 된다...
이 Visual VM을 이용해서 java process를 모니터링 해보자~



위 그림처럼 jvisualvm.exe 파일이 보인다.
실행 파일을 더블클릭하면. 아래 그림처럼.. Visual VM이 실행된다.




실행되면. 아래 그림과 같은 창이 나타나는데..
Local 항목을 보면. 이미 내 PC에 실행중인 java process에 대한 정보들이 자동으로 등록된 것을 확인할 수 있다.
weblogic.Server 항목을 더블클릭하면 화면의 오른쪽에 해당 process에 대한 정보가 보인다.



오른쪽 화면에서 "Monitor" 탭을 클릭하면, Heap, Classes, Threads 에 대한 모니터링 상황을 볼 수 있다.



이제, 서버의 process를 모니터링 하는 법을 알아보자.
왼쪽의 메뉴에서 "Remote"를 선택하고 마우스 오른쪽 버튼을 클릭하면  "Add Remote Host" 메뉴가 보인다.



"Add Remote Host" 메뉴를 클릭하면 서버의 IP를 입력하는 창이 나타난다.
서버의 IP를 입력하고, "OK" 버튼을 클릭한다.




이제, 왼쪽 메뉴에서 "Remote" 메뉴 밑에 방금 추가한 서버의 IP가 보이는데, 이를 선택하고 마우스 오른쪽 버튼을 클릭하고,
메뉴중에 "Add jstatd Connection" 메뉴를 선택한다.



위에서 등록한 서버의 jstatd 와 통신하기 위한 설정을 추가한다.



자, 이제 서버에 jstatd를 설정하는 방법을 알아보자.

서버에서 해야 할 일은 아래의 3가지이다.
1. rmiregistry 실행
2. policy 파일 작성
3. jstatd 실행



첫번째, rmiregistry 실행은

$rmiregistry 2020 &

백그라운드로 2020 포트를 사용한다고 실행하면 된다.
2020포트는 위에서 "Add jstatd Connection" 설정할 때 입력한 포트번호이다.

두번째, policy 파일은

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};


위 내용을 jstatd를 실행하는 디렉토리에 파일로 저장한다.

세번째, jststd는

위에서 만든 policy 파일과, rmiregistry 포트를 이용하여 다음과 같이 실행한다.

$ jstatd -J-Djava.security.policy=jstatd.all.policy -p 2020


위 작업이 모두 끝난후에 Visual VM을 보면 아래 그림과 같이 서버의 java process들에 대한 정보를 확인할 수 있다.


process 중에 하나를 선택하면 요약 정보를 확인할 수 있고,



"Monitoring" 탭을 선택하면 Threads, Classes, Heap 등을 확인할 수 있다.

:
Posted by 뽀기
2010. 2. 19. 19:17

properties 파일 로딩하기 그거/Java2010. 2. 19. 19:17


   config.properties 파일은 CLASSPATH에 있다고 가정한다.
   
   ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
   is = classLoader.getResourceAsStream("config.properties");
   Properties properties = new java.util.Properties();
   properties.load(is);
   System.out.println(properties);

   이리 하면.. 로딩된다. ㅎㅎ
:
Posted by 뽀기

HTML 소스에서 <img .... > 태그만 정규표현식을 이용해서 추출할 수 있다~~

Pattern.compile("<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>");

위의 패턴을 이용하면 된다는..

하나씩 보자.

<img
[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
<img 태그를 찾는다.( <img......... )

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
>가 아닌 모든 것들..(<img height=100 width=50 ......)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
src= 속성을 찾는다. (<img height=100 width=50 src=.....)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
"나 '가 0 또는 1번 이상 나타나고, (<img height=100 width=50 src='......)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
>나 ", '가 1 또는 그 이상 나타나며, (<img height=100 width=50 src='10.gif......)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
"나 '가 0 또는 1번 이상 나타나고, (<img height=100 width=50 src='10.gif'......)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
>가 아닌 모든 문자들.. (<img height=100 width=50 src='10.gif' alt='10'......)

<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>
> 로 끝나는 (<img height=100 width=50 src='10.gif' alt='10'>)

문자열 이라는거죠~

<img height=100 width=50 src='10.gif' alt='10'>

아래 예제를 돌려보자~~

package cis.jcaps.app;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternTest
{
 final static Pattern nonValidPattern  =  Pattern.compile("<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>");
 final static File indexFile = new File("index.html");
 
 public static void main(String[] args) {
  List<String> list = null;
  String str = null;
  StringBuilder sb = new StringBuilder();
  BufferedReader br = null;
  
  try {
   System.out.println(indexFile.exists());
   br = new BufferedReader(new FileReader(indexFile));
   while( (str = br.readLine()) != null ) {
    sb.append(str);
   }
  } catch(Exception e) {
   e.printStackTrace();
  }
  list = stripNonValidXMLCharacters(sb.toString());
  
  for(String tmp : list ) {
   System.out.println(tmp);
  }
 }

public static List<String> stripNonValidXMLCharacters(String str) {
  List<String> result = new ArrayList<String>();
  StringBuffer out = new StringBuffer();
  Matcher matcher = nonValidPattern.matcher(str);

  while (matcher.find()) {
   result.add(matcher.group(1));
  }
  matcher.appendTail(out);
  return result;
 }
}

:
Posted by 뽀기
2010. 1. 29. 19:09

XML 특수 문자 파싱 오류 확인 그거/Java2010. 1. 29. 19:09


<?xml version=\"1.0\" encoding=\"euc-kr\"?><root><data>한&#123;글1234 &#xF;5678&#15; &#16; English日本0A</data></root>

이런 XML을 파싱을 하다 보면...

[Fatal Error] :4:13: Character reference "&#15" is an invalid XML character.
org.xml.sax.SAXParseException: Character reference "&#15" is an invalid XML character.
 at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
 at cis.jcaps.app.XMLParserTest.handle(XMLParserTest.java:75)
 at cis.jcaps.app.XMLParserTest.doIt(XMLParserTest.java:53)
 at cis.jcaps.app.XMLParserTest.main(XMLParserTest.java:177)

이런 에러가 납니다.

바로 &#15; 요놈!. 특수문자가 변환된 놈 때문이지요..

이걸 HTML 파일로 저장해서 보면..



이렇게 보입니다.. 꼭 벌레같다는..

암튼. 저 데이터를 XML로 변환을 하면.. &#15; 가 되지요.

이  &#15; 를 다시 원래 벌레로 만들려면 XML 파서가 바로 위 같은 에러를 뱉어냅니다.

이 문제를 해결하기 위해서..

final Pattern nonValidPattern = Pattern.compile("&#(x?)([0-9a-fA-F]+);");

 public String stripNonValidXMLCharacters(String str) {
  StringBuffer out = new StringBuffer();
  Matcher matcher = nonValidPattern.matcher(str);
  int value = 0;
  boolean isHex = false;
  boolean valid = false;
  while (matcher.find())
  {
   isHex = matcher.group(1) != null;
   value = Integer.parseInt(matcher.group(2), isHex ? 16 : 10);
   valid = false;
   if ((value == 0x9) ||
     (value == 0xA) ||
     (value == 0xD) ||
     ((value >= 0x20) && (value <= 0xD7FF)) ||
     ((value >= 0xE000) && (value <= 0xFFFD)) ||
     ((value >= 0x10000) && (value <= 0x10FFFF)))
    valid = true;
   if (!valid)
    matcher.appendReplacement(out, "");
  }
  matcher.appendTail(out);
  return out.toString();
 }

이 method를 사용하면 됩니다.

"&#(x?)([0-9a-fA-F]+);"

바로 이 패턴을 이용하여, &#xx; 이런식의 문자열을 지워버리는거죠.

&#로 시작하고,
&#뒤에 x가 0번 혹은 1번만 나오고.
&#뒤에 뒤에 숫자, 또는 영문자 a~f 까지만 허용되는 문자열이 1번 이상 나오고,
마지막은 ; 로 끝나는 문자열을 찾는거죠.

해당 문자열을 찾은 후에

   if ((value == 0x9) ||
     (value == 0xA) ||
     (value == 0xD) ||
     ((value >= 0x20) && (value <= 0xD7FF)) ||
     ((value >= 0xE000) && (value <= 0xFFFD)) ||
     ((value >= 0x10000) && (value <= 0x10FFFF)))
    valid = true;


이 루틴을 이용해서, XML 파싱에 허용되는 문자들만 거르게 되는겁니다!! 냐하하하.

:
Posted by 뽀기
Inner Class에서 OuterClass의 변수를 참조하려면 아래와 같이 해야 된다는군요.
홋.홋.홋.홋.

01: class OuterClass {
02:     int varA = 100;
03:     class InnerClass {
04:         static final int varA = 20;
05:         void methodCall() {
06:             int varB = varA;
07:             int varC = this.varA;
08:             int varD = Outer.this.varA;
09:         }
10:     }
11: }

02 라인의 varA와 04 라인의 varA의 변수명이 같습니다.
이런 경우, 아래 처럼 하면....

06:             int varB = varA;
07:             int varC = this.varA;

varB와 varC에는 20이란 값이 들어갑니다.


OuterClass에 정의되어 있는 변수에 접근하기 위해서는....
아래와 같이 해야 합니다~

08:             int varD = Outer.this.varA;

varD에는 100이란 값이 들어가는거죠!
:
Posted by 뽀기


jar 파일이 변경-버전업, 또는 이름 변경-될 때마다 eclipse에서 library 정보도 변경해줘야 되고,
개발자들에게 배포된 것도 확인해줘야 되고, 등등등. 이래저래 구찮은 일이 많아서.
그냥 jar 파일명에서 버전을 뺀 상태에서 버전관리만 하려고 찾다보니.
Manifest.MF 파일에 있는 버전 정보를 읽으면 되겠다 싶어서 만든 샘플.


checkVersion.java

import java.util.*;

public class checkVersion {
        JarFile jarFile;
        Manifest manifest;
        Attributes attributes;
        String jarFileName;
        String version;

        public checkVersion(String filename) {
                jarFileName = filename;
        }

        public void printVersion() {
                try {
                        // jar 파일을 읽습니다.
                        jarFile = new JarFile(new File(jarFileName));
                        // jar 파일에서 manifest 정보를 가져옵니다.
                        manifest = jarFile.getManifest();
                        // manifest에서 main 정보를 가져옵니다.
                        attributes = (Attributes)manifest.getMainAttributes();

                        // attribute 중에서 Implementation-Version 정보를 추출한다.
                        version = attributes.getValue("Implementation-Version");
                        System.out.println("@@ " + version);

                        /* 아래처럼 하면 manifest의 main 정보 전체를 확인할 수 있다.
                        for (Iterator it=attributes.keySet().iterator(); it.hasNext(); ) {
                                Attributes.Name attrName = (Attributes.Name)it.next();
                                String attrValue = attributes.getValue(attrName);

                                System.out.println("## " + attrName + " : " + attrValue);
                        }
                        */
                } catch(Exception e) {
                        e.printStackTrace();
                }
        }

        public static void main(String[] args) {
                if( args.length != 1 ) {
                        System.out.println("Usage : ");
                        System.out.println("    java printVersion [jar_file_name]");
                        return;
                }

                /*
                if( !(new File(args[0])).exists() ) {
                        System.out.println("Error : ");
                        System.out.println("[" + args[0] + "] file does not exist.");
                        return;
                }
                */

                checkVersion cv = new checkVersion(args[0]);
                cv.printVersion();
        }
}



 MANIFEST.MF


Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Niall Pemberton
Build-Jdk: 1.5.0_07
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: Apache Commons IO Bundle
Bundle-SymbolicName: org.apache.commons.io
Bundle-Vendor: The Apache Software Foundation
Bundle-Version: 1.4
Export-Package: org.apache.commons.io;version=1.4,
 org.apache.commons.io.comparator;version=1.4,
 org.apache.commons.io.filefilter;version=1.4,
 org.apache.commons.io.input;version=1.4,
 org.apache.commons.io.output;version=1.4
Implementation-Title: Commons IO
Implementation-Vendor: The Apache Software Foundation
Implementation-Vendor-Id: org.apache
Implementation-Version: 1.4
Import-Package: org.apache.commons.io;version=1.4,
 org.apache.commons.io.comparator;version=1.4,
 org.apache.commons.io.filefilter;version=1.4,
 org.apache.commons.io.input;version=1.4,
 org.apache.commons.io.output;version=1.4
Specification-Title: Commons IO
Specification-Vendor: The Apache Software Foundation
Specification-Version: 1.4
X-Compile-Source-JDK: 1.3
X-Compile-Target-JDK: 1.3 


실행결과

weblogic@WAS01[/export/home/weblogic]# java checkVersion commons-net-1.4.1.jar
@@ 1.4.1


 

'그거 > Java' 카테고리의 다른 글

XML 특수 문자 파싱 오류 확인  (0) 2010.01.29
[Java] Inner Class에 이런 것이 있었군요...  (0) 2009.09.29
JMeter 사용하기...  (2) 2009.08.20
JCONSOLE 사용하기.  (0) 2009.07.28
[ShutdownHook] 오랜만의 Java 포스팅..  (0) 2009.07.18
:
Posted by 뽀기
2009. 8. 20. 17:43

JMeter 사용하기... 그거/Java2009. 8. 20. 17:43


JMeter라고 하는 아주 괜찮은 툴이 있습니다.
사용법을 잘 아는것은 아니지만, 그래도 가끔 HTTP 테스트용으로 유용하기에 사용법을 간단하게 정리해둡니다.

# 전제 조건
1. http://localhost:7001/fmsclient/request.jsp 파일이 존재합니다.
2. request.jsp는 userId, name, age, addr을 parameter로 받아서 출력합니다.

# 작업 순서
1. JMeter 홈페이지에가서 JMeter를 다운로드 받습니다.
   http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi

2. 압축을 풀면 아래 그림과 같은 파일/폴더들이 나타납니다.



3. bin 폴더에 보면, "jmeter.bat" 를 실행하면 아래 그림과 같이 JMeter 창이 나타납니다.
    "Test Plan" 이라고 나옵니다. 여기에 JMeter에서 실행될 각 Test들에 대한 전체적인 세팅을 합니다.
   체크박스 두개가 있는데,
   Run Thread 어쩌구 하는 체크박스는 Test Plan에 생성된 Thread Group(뒤에 설명하겠지만 실제 작업 단위이다.)을
   동시에 실행할 건지, 한 번에 하나씩 실행할 건지 여부를 나타내고,
   Functional Test 어쩌고 한거는 실행 결과를 파일로 저장할지 여부를 나타냅니다.



4. 이제 실제 작업 단위인 Thread Group을 추가합니다.
   아래그림처럼, Test Plan을 선택하고 마우스 오른쪽 버튼을 클릭해서 Add > Thread Group을 선택합니다.


5. Thread Group을 추가하면 아래 그림과 같이 나타나는데, 각 항목을 적절하게 설정합니다.
    이름을 지정하고, 중간에는 에러나면 어떻게 할 건지를 나타내는 부분이 잇고,
    그 아래 부분에 실제 작업을 수행하는 Thread의 개수와 시간들에 대해서 설정하도록 되어 있습니다.
    Number of Threads(users) 는 실행할 Thread의 수, 즉, 몇명의 사용자가 동시에 호출을 하는지 여부를 나타냅니다.
    Ramp-Up Period(in seconds)는 전체 쓰레드가 전부 실행되는데까지 걸리는 시간을 나타냅니다.
    예를 들어, Number of Thread가 5개이고, Ramp-Up Period가 15초 일 경우에,
    첫번째 thread가 수행된 후 다음 thread가 수행될때까지 3초를 대기한단 얘기.
    즉, 전체 5개 Thread가 15초동안 실행이 되려면, 3초마다 하나씩 실행이 되어야 된다는 겁니다.
    Loop Count는 각 Thread가 몇번씩 실행을 할 것인지를 나타냅니다. Forever에 체크하면 무한루프입니다.


6. Thread Group을 추가했으면, 이제 실제 Thread로서 어떤 동작을 하는지에 대한 설정을 추가합니다.
   먼저, 아래 그림처럼 Add > Config Element > HTTP Request Defaults 를 선택합니다.
   이 HTTP Request Defaults는 Thread가 HTTP 요청을 할 때 어떤 정보를 갖고 요청을 할것인지에 대한 전체적인 설정을 합니다.
  


7. HTTP Request Defaults를 추가하고, 아래 그림과 같이 설정을 합니다.
   여기에서 설정한 정보들은 Thread 들이 HTTP 요청을 할 때마다 적용이 되는 내용입니다.
   Name을 입력하고, Web Server 항목에 각 값을 입력합니다.
   Server Name or IP : 도메인명 또는 IP를 입력(전체 URL을 입력하지 않습니다.)
   Port Number : 포트 입력
   Timeouts 각 항목을 설정합니다.
   HTTP Request의 각 항목을 입력합니다.
   Path : 호출할 전체 URL에서 IP 또는 도메인명과 Port 를 제외한 나머지 URL을 입력합니다.
   Send Parameters With the Request : 호출할 URL에 넘겨줄 parameter를 설정합니다.



8. 이제, 실제 HTTP 요청을 날릴 개체를 추가합니다.
   아래 그림과 같이, Add > Sampler > HTTP Request를 선택합니다.


9. 아래 그림과 같이 나타나는데, 이 HTTP Request는 위에서 추가한 HTTP Request Defaults 라는 
   Config Element의 설정값들을 상속
받아서 사용하기 때문에, 따로 설정할 내용은 없습니다.



10. 이제 데이터 요청하는 개체를 만들었으니, HTTP 요청의 결과를 받는 개체들을 추가합니다.
     아래 그림과 같이, Add > Listener > View Results Tree, Add > Listener > Graphic Results 를 추가합니다.






11. 아래 그림과 같이 Listener들이 추가됩니다.


12. 실행을 위한 준비는 끝났고, 아래 그림과 같이 Run > Start 를 클릭하여 방금 추가한 Thread Group을 실행합니다.



13. 실행이 끝나고 나면, 아래 그림과 같이 View Results Tree를 선택하면,
     Thread가 실행한 각 요청(HTTP Request Sampler)마다 응답 데이터를 확인할 수 있습니다.



14. Graph Results를 선택하면 아래 그림과 같이, 각 요청마다의 처리 시간들에 대한 정보를 확인할 수 있습니다.

:
Posted by 뽀기
2009. 7. 28. 11:20

JCONSOLE 사용하기. 그거/Java2009. 7. 28. 11:20


1. jconsole을 사용하기 위한 환경 설정
2. 프로그램 실행 시 jconsole 연동을 위한 VM 옵션주기 


1. 환경 설정
  - %JAVA_HOME%/jre/lib/management/ 로 이동
  - jmxremote.password.template 파일을 복사하여 jmxremote.password 파일을 생성
  - jmxremote.password 파일의 제일 밑에 있는 아래 내용 주석 해제
    # monitorRole  QED
    # controlRole   R&D
  - jmxremote.password 파일을 읽기 전용으로 만든다.

2. 옵션 설정
  -Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=8999
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.password.file=[passwordFilePath]/jmxremote.password


# jmxremote.password 파일 관련하여 에러 발생할 수 있음

   Password file read access must be restricted ........ 

   이런 에러 발생할 경우 아래와 같이 해준다.

   1. UNIX 환경
       $ chmod 444 jmxremote.password
   2. 윈도우 환경
       > cacls jmxremote.password /P Administrator:R

  
:
Posted by 뽀기
2009. 7. 18. 14:19

[ShutdownHook] 오랜만의 Java 포스팅.. 그거/Java2009. 7. 18. 14:19

예전에도 함 봤던것 같은데..
오늘 소스 리뷰하면서 다시 보게 되서 정리를 함 해본다..

Java 로 프로그램을 만들어서 돌리다 보면..
Ctrl+C 를 이용해서 프로그램이 종료되는 경우가 있다.
이런 경우에는 JVM 자체가 죽어버리기 때문에 해당 프로그램에서 종료 작업을 처리할 수 없게 된다.

하지만, ShutdownHook 이란걸 이용하면, Ctrl+C로 Java 프로그램을 종료시켜도 마무리(?) 작업을 할 수 있다.
프로그램의 종료를 감지할 ShutdownHook은 Thread 를 상속받아서 작성하고,
마무리 작업들은 run() 메소드안에 로직을 작성하면 된다.
그리고, 해당 ShutdownHook은 프로그램에서 Runtime.getRuntime().addShutdownHook() 을 이용하여 등록한다.

아래 예제 코드가 있다.
프로그램이 실행되면서 lock 파일을 생성하면, 다른 프로그램은 실행을 할 수 없도록 한다.
이미 실행중인 프로그램이 종료되면서 lock 파일을 삭제하면, 그제서야 다른 프로그램이 실행될 수 있도록 한다.

# Java Application

import java.io.File;
import java.io.IOException;

public class ShutdownHookDemo {
 private String lockFile = "./shutdownhook.lock";

 public ShutdownHookDemo() {
  // create a lock file
  File file = new File(lockFile);
  try {
   System.out.println("Creating lock file");
   if( file.exists() ) {
    System.out.println("lock file already exists.");
    System.exit(0);
   }

   file.createNewFile();
  }
  catch (IOException e) {
   System.out.println("Failed creating lock file.");
  }
 }

 private void init(){
  // ShutdownHook 등록
  ShutdownHook shutdownHook = new ShutdownHook(lockFile);
  Runtime.getRuntime().addShutdownHook(shutdownHook);
 }

 public static void main(String[] args) {
  ShutdownHookDemo demo = new ShutdownHookDemo();
  demo.init();
  try {
   while(true){
    int a = System.in.read();
    // 'q' 입력하면 프로그램 종료
    if( a == 113 ) break;
   }
  } catch(Exception e) {
   e.printStackTrace();
  }
 }
}

# ShutdownHook

import java.io.File;

class ShutdownHook extends Thread {
 String lockFile = null;
 
 public ShutdownHook(String lockFile) {
  this.lockFile = lockFile;
 }
 
 public void run() {
  shutdown();
 }
 
 private void shutdown() {
  System.out.println("Start shutdown progress.. please wait");
  // delete the lock file
  File file = new File(lockFile);
  if (file.exists()) {
   System.out.println("Deleting lock file. [" + lockFile + "]");
   file.delete();
  }
 }
}



 


# 실행 결과
1. 프로그램이 Ctrl+C로 인해 비정상 종료될 경우
C:\LuckyData\CIS\workspace\TEST>java -classpath C:\LuckyData\CIS\workspace\TEST\WebRoot\WEB-INF\classes ShutdownHookDemo
Creating lock file
^C

Start shutdown progress.. please wait
Deleting lock file. [./shutdownhook.lock]



2. 프로그램이 정상 종료될 경우
C:\LuckyData\CIS\workspace\TEST>java -classpath C:\LuckyData\CIS\workspace\TEST\WebRoot\WEB-INF\classes ShutdownHookDemo
Creating lock file
this is a test
hahahah
q
Start shutdown progress.. please wait
Deleting lock file. [./shutdownhook.lock]



=> ShutdownHook 은 프로그램이 종료될때 항상 실행된다는 걸 확인할 수 있다.


'그거 > Java' 카테고리의 다른 글

JMeter 사용하기...  (2) 2009.08.20
JCONSOLE 사용하기.  (0) 2009.07.28
RAC 환경에서 JDBC URL 설정  (0) 2009.06.02
log4j 사용해서 로깅하기  (0) 2009.01.15
[강추] JFace 예제 따라하기  (0) 2008.12.15
:
Posted by 뽀기