달력

4

« 2024/4 »

  • 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
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 뽀기