25

Javaコマンドラインプログラムを正常にシャットダウンするためのさまざまなアプローチに興味があります。キルシグナルを送信することはオプションではありません。

私はいくつかの異なるアプローチを考えることができます。

  1. ポートを開き、接続を待ちます。作成したら、正常にシャットダウンします。
  2. 作成されるファイルを監視してから、シャットダウンします。
  3. 「シャットダウンの実行」など、端末からの入力を読み取ります。

3つ目は、プログラム出力が画面に送り出されることが多いため、理想的ではありません。最初のものはあまりにも多くの努力を要します(私は怠惰です)。ほとんどのプログラマーは2番目のオプションを使用しますか?そうでない場合、他に何が可能/エレガント/シンプルですか?

4

7 に答える 7

19

次のようなことを試すことができます:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

編集:

シャットダウン フックはアプリのシャットダウンを実行しません。代わりに、開発者がシャットダウン時に希望するクリーンアップを実行する方法を提供します。

JavaDoc for Runtimeから(このメソッドを使用する予定がある場合は、よく読んでください):

シャットダウン フックは、単に初期化されているが開始されていないスレッドです。仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが不特定の順序で開始され、同時に実行されます。finalization-on-exit が有効になっている場合、すべてのフックが終了すると、呼び出されていないすべてのファイナライザーが実行されます。最後に、仮想マシンが停止します。...

于 2009-06-22T18:23:03.143 に答える
8

Runtime.getRuntime().addShutdownHook()要件を満たす必要があるものを使用してみてください。このようにして、正常なシャットダウンを実行するために、クリーンアップを行うフックを登録できます。

編集

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) public void addShutdownHook(Thread hook) 新しい仮想マシンのシャットダウンを登録します針。Java 仮想マシンは、次の 2 種類のイベントに応答してシャットダウンします。

  • 最後の非デーモン スレッドが終了するか、exit (同等の System.exit) メソッドが呼び出されると、プログラムは正常に終了します。
  • 仮想マシンは、 ^C の入力などのユーザー割り込み、またはユーザーのログオフやシステムのシャットダウンなどのシステム全体のイベントに応答して終了します。
于 2009-06-22T18:22:56.217 に答える
6

2 番目のオプション (ファイルのチェック) の利点は、最初のオプション (ポートをリッスンするオプション) よりも、ある程度のセキュリティの可能性があることです。

適切なユーザーのみがプログラムを閉じることができるように、ファイルが作成されたディレクトリにアクセス許可を設定できます。ポートでリッスンすると、どのユーザーもそれに接続できます。

于 2009-06-22T18:27:58.423 に答える
4

ソケット バージョンを使用する場合は、実装が非常に簡単です。コードは次のとおりです。

ServerSocket server = new ServerSocket(8080);
System.out.println("Socket listening!");
server.accept();
System.out.println("Connection received!");

プログラムで開始する別のスレッドにこのコードを簡単に埋め込み、グローバル状態を変更してシャットダウンを開始することができます。

于 2009-06-22T18:53:42.750 に答える
2

最初の 2 つのオプションは簡単に実装できます。また、いくつかの JMX を使用することもできます (私はそれについてあまり知りません)。Tomcat は最初のアプローチを使用し、私は 2 つのプロジェクトで 1 と 2 を適用しました。

于 2009-06-22T18:22:39.460 に答える
2

JMX コンポーネントを持つことを検討してください。次に、ローカルまたはネットワーク経由で JConsole に接続し、コンポーネントと通信できます。その後、コンポーネントはプログラムを適切にシャットダウンできます。

Java 6 u 10 以降では、JVisualVM で同じことができます。

于 2009-06-22T19:42:10.487 に答える
-1

シャットダウンフックを使用することをお勧めします。これにより、標準の OS ツールを使用してプログラムを制御できます。また、外部リソース (ディスク、ポートなど) への追加アクセスも必要ありません。

于 2009-06-22T18:30:34.563 に答える