2012-04-25 13 views
1

BLOCKQUOTE中断された場合にプログラムがデータを失うのを防ぐ方法を教えてください。

私は定期的に実行する必要のある機能を持つJavaプログラムを持っています。しかし、私はラッパープログラムを終了することができます(あなたがUNIXの人なら、ターミナルウィンドウやSIGTERMではCtrl + Cと思っています)、ラッパーが起動するメインプログラムのプロセスやスレッドを中断する危険はありません。

最初は、処理のたびに一定の間隔でメインプログラムをスリープさせるべきだと思っていました。次に、プログラムを終了してユーザーが手動で中断した場合、データの処理中に中断され、出力ファイルが途切れたり破損したりする可能性があると考えました。

私は、メインプログラムを呼び出すラッパープログラム(おそらくJavaでも)を書くことをお勧めします。何かがラッパーを閉じると、正常に終了する準備ができるまで、メインプログラムの生成されたスレッドまたはプログラムインスタンスを開いたままにします。さらに、メインプログラムのたかだか1つのインスタンスがいつでも実行されている必要があります。メインプログラムのインスタンスが実行されている場合は、他のメインプログラムのインスタンスを起動何も しない :

n分ごとに:

は、ここで私は私のラッパーは(擬似コードで)やりたいものです。クローズ時に

: それは

を実行している場合、私は(効果的にコマンドラインから)私のメインプログラムを実行するか、私は私のメインプログラムを変更する必要がありますJavaランタイムオブジェクト/ライブラリを使用すべき完了までのメインプログラムの実行を残しますRunnableを実装し、私のメインプログラムを実行するスレッドを生成するラッパープログラムを持っていますか?

EDIT(可能な解決策?):

現在、私は(http://docs.oracle.com/javase/7/docs/api/java/lang/Process.htmlhttp://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.htmlを参照)exec関数を使用して、メインプログラムを呼び出すためにJavaランタイムオブジェクトを使用してと思っています。メインプログラムが既に実行されているかどうかを判断するには、Process.exitValue()関数を使用します。 IllegalThreadStateExceptionをスローすると、メインプログラムはまだ実行されています。

+0

1つの解決方法は、control-Cを使用しないことです。すべての_ソフトウェアはJMXボタンで閉じています。これにより、クラスを適切に閉じて、JVMが難しくなったときにクラスを閉じる必要がなくなります。 – Gray

+0

私のプログラムは端末/コンソールから実行されますが、GUIはありません。 – user1258361

+0

問題ではありません。 JMXボタンを簡単に公開し、JMXコマンドラインクライアントを使用してアプリケーションを終了することもできます。 – Gray

答えて

0

特定のフラグが静的に設定された新しいスレッドを作成します。このスレッドはメインアプリケーションの起動時に実行され、そこから実行/ロードされます。 プログラムの終了アクションでJavaイベントリスナーを作成し、その中に新しいスレッドを登録します。あなたのプログラムが閉じられるたびに、この新しいスレッドは生き残るために他のスレッドを開始し、上記の条件の1つを実行するためにリソースの最終節約を行います。上記のすべての条件(フラグ)が満たされるまで、新しいプロセスは次々とこれらのスレッドを次々に終了させます(それぞれが終了したときはいつでも)。残りのスレッドがなくなると、この新しいスレッドは自動的に終了し、プログラムは終了します。

1

アプリケーションがSIGINT(Control-C)を取得したときに、シャットダウンフックを使用して正常にシャットダウンすることができます。Runtime.addShutdownHook(...)を参照してください。

しかし、これはSIGKILL、JVMクラッシュ、オペレーティングシステムのクラッシュ、およびハード電源障害を処理しません。実際、この種のシナリオでアプリケーションをきれいにシャットダウンする方法はありません。そのためには、堅牢な永続性メカニズムを使用してアプリケーションを設計して、その状態を定期的に維持する必要があります。

関連する問題