2012-02-03 5 views
5

JVM-ran (실제로 스칼라로 작성되었지만 Groovy, Clojure 또는 pure Java에 대해 솔루션이 거의 동일하다고 생각하는 경향이 있음) 내 컴퓨터 프로그램은 Ctrl을 눌러 종료됩니다. + C (또는 시스템 종료 순서에 따라 프로그램에 차이가 있는지 모르겠다.) 응용 프로그램이 수정하는 외부 리소스 (데이터베이스, 파일, 웹 서비스 추상화 된 리소스)를 확인하려면 어떻게해야합니까? 예측 가능하고 비 논리적으로 손상된 상태로 남겨 둡니까?JVM 콘솔 어플리케이션에서^C를 다루는 방법은 무엇입니까?

답변

7

Runtime.addShutdownHook을 살펴보십시오.

당신은 일반적으로 너무 그것을 사용한다 :

Runtime.addShutdownHook(new Thread() { 
    public void run() { 
     // do your clean up here. 
    } 
}); 
3

이 신호를 트랩하여 자원을 차단할 수 있습니다. 대부분의 서비스는 정상적으로 종료 할 필요는 없지만 일반적으로 작성하는 파일은 정상적으로 처리해야합니다.

셧다운 훅을 추가하는 것만으로도 충분합니다. 그러나 나는이 상황을 시험해 볼 것입니다.

10

당신은 다른 사람들이 지적으로 종료 훅을 구현하려고하지만 수 : 가상 머신이 중지됩니다 드문 상황에서

, 즉, 을 완전히 종료하지 않고 실행하십시오. 가상 컴퓨터가 외부에서 종료 된 경우 (예 : Unix의 경우 SIGKILL 신호 또는 Microsoft Windows의 경우 TerminateProcess 호출). 예를 들어 이 내부 데이터 구조를 손상 시키거나 존재하지 않는 메모리 인 에 액세스하려고 시도하여 원시 메소드가 실패 할 경우 가상 시스템 도 중단 될 수 있습니다. 가상 시스템이 중단되면 시스템 종료 훅이 실행되는지 여부에 대한 보장이 이루어지지 않습니다 ( ).

내가 생각하기에, 응용 프로그램에 트랜잭션 컨텍스트를 도입해야한다고 생각합니다. 꽤 쉬운 데이터베이스의 경우, 파일 시스템에 대해서는 Apache Commons Transaction

+0

+1 또한 정전 및 시스템 장애로부터 프로그램을 보호 할 수있는 유일한 방법입니다. – josefx

관련 문제