2012-02-03 5 views
5

実際にはScalaで書かれたが、ソリューションがGroovy、Clojure、または純粋なJavaの場合とほぼ同じになると思う傾向がある)私のコンソールプログラムは、Ctrl + C(または、システムのシャットダウンシーケンスによって、プログラムに違いがあるかどうかわかりません)、アプリケーションが変更する外部リソース(データベース、ファイル、Webサービス抽象化リソース)予測可能で非論理的に壊れた状態になっていますか?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

関連する問題