[ShutdownHook] 오랜만의 Java 포스팅.. 그거/Java2009. 7. 18. 14:19
예전에도 함 봤던것 같은데..
오늘 소스 리뷰하면서 다시 보게 되서 정리를 함 해본다..
Java 로 프로그램을 만들어서 돌리다 보면..
Ctrl+C 를 이용해서 프로그램이 종료되는 경우가 있다.
이런 경우에는 JVM 자체가 죽어버리기 때문에 해당 프로그램에서 종료 작업을 처리할 수 없게 된다.
하지만, ShutdownHook 이란걸 이용하면, Ctrl+C로 Java 프로그램을 종료시켜도 마무리(?) 작업을 할 수 있다.
프로그램의 종료를 감지할 ShutdownHook은 Thread 를 상속받아서 작성하고,
마무리 작업들은 run() 메소드안에 로직을 작성하면 된다.
그리고, 해당 ShutdownHook은 프로그램에서 Runtime.getRuntime().addShutdownHook() 을 이용하여 등록한다.
아래 예제 코드가 있다.
프로그램이 실행되면서 lock 파일을 생성하면, 다른 프로그램은 실행을 할 수 없도록 한다.
이미 실행중인 프로그램이 종료되면서 lock 파일을 삭제하면, 그제서야 다른 프로그램이 실행될 수 있도록 한다.
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();
}
}
}
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 |