私はいくつかのJavaアプリケーションを実行しており、Windowsのbatスクリプトからすべてのアプリケーションを正常に終了/閉じる必要があります。 私の質問は次のとおりです:
Windowsのbatスクリプトでシャットダウンフックを起動し、正常にシャットダウンするJavaプログラムを呼び出す方法。Javaプロセスの正常なシャットダウン/終了を行うには?
ご迷惑をおかけして申し訳ございません。 ありがとうございます。
私はいくつかのJavaアプリケーションを実行しており、Windowsのbatスクリプトからすべてのアプリケーションを正常に終了/閉じる必要があります。 私の質問は次のとおりです:
Windowsのbatスクリプトでシャットダウンフックを起動し、正常にシャットダウンするJavaプログラムを呼び出す方法。Javaプロセスの正常なシャットダウン/終了を行うには?
ご迷惑をおかけして申し訳ございません。 ありがとうございます。
通常、Javaの「正常な」シャットダウンは、すべての非デーモンスレッドが正常に作業を完了するようにすることで実現します。あなたのアプリケーションがあるポートで「シャットダウン」コマンドをリッスンしている場合は、そのポートにコマンドをトリガーさせて、スレッドが動作を停止するための適切なフラグを設定し、JVMをシャットダウンする。それはおそらく私がそれを見た最も単純な方法です。
.batスクリプトは、VM外部のプロセスになります。したがって、あなたのJavaアプリケーションにある種のIPCを実装する必要があります。 RMIまたはJMXを使用するのは比較的簡単なオプションです。
その他の可能性として、アプリケーションで監視できるファイルを使用し、.batスクリプトで変更して他のプロセスがシャットダウンする必要があることを認識させることができます。
Runtime
クラスのaddShutdownHookメソッドを見てください。
Runtime.getRuntime().addShutdownHook(...);
UPDATE:以下のコメントを1として、* nixのkillコマンドに似ているWindowsシェルのコマンドTASKKILLがあります。たとえばTASKKILL /IM java.exe
はすべてのJavaプロセスを終了します。 TASKLIST
を使用して、実行中のプロセスをすべて見つけることができます。これをshutdownhookと組み合わせて使用すると、必要な優雅な可能性が得られます。
これは、シャットダウン時にスレッドを呼び出すことについてですが、シャットダウン自体は起動しません。 – weekens
Java 7(まだリリースされていない)にはファイル監視APIがあります。現在、opensource JNotifyライブラリを使用できます。 – djna