2013-10-23 12 views
9

私はかなり複雑なJavaのシャットダウンをしています。すべきことはたくさんあります。特に私は、シャットダウンフックスレッドからエラーを処理する方法を理解しようとしています。私のコードは、この現在含まれています:System.exitがシャットダウンフックから呼び出された場合はどうなりますか?

try { 
    return shutdownPromise = doShutdown(); 
} 
catch (Throwable exc) { 
    logger.error("An exception was thrown while shutting down the application.", exc); 
    System.exit(1); 
    return null; 
} 

私はもともと、私は基本的にシャットダウン時にエラーがちょうどexitにまっすぐに行くべき、と思ったこれを書いたとき。しかし、exitはそれほど低いレベルではありません。シャットダウンフックが呼び出されます。

は、だから私は思った -

  1. シャットダウンフックから呼び出す出口は何をしますか?
  2. シャットダウンフックからエラーを処理する正しい方法は何ですか?
+4

@libikなぜですか?それは知識を共有するために実際に励まされます。実際には、具体的には「自分の質問に答える」というチェックボックスがあります。 – Doorknob

+0

これはいい答えです。 upvoteの価値がある。 – Bathsheba

+1

さて、実際に質問をしている限り、あなた自身や他の人の助けを借りてそれを理解してください...誰かが何らかの反応を出す前に質問と回答をしないでください。 – libik

答えて

19

まず、簡単な答え:プロセスがデッドロックします。

にSystem.exitはthis code blockで終わるShutdown.exitを、呼び出し巻き取る:

synchronized (Shutdown.class) { 
    /* Synchronize on the class object, causing any other thread 
     * that attempts to initiate shutdown to stall indefinitely 
     */ 
    sequence(); 
    halt(status); 
} 

コメントが完全に正確です。しかしこれを理解するためには、シャットダウンフックが何をするのかを正確に把握する必要があります。

this answer hereで説明されているように、シャットダウンフックがApplicationShutdownHooks.addで追加されます。これらのフックはない、アプリケーションのシャットダウンフックであることに注意してください、まず

if (hook != null) hook.run(); 

:最終的には上記のsequence方法はShutdown.runHooksthis line of codeに巻き取ることに注意してください。これらはシステムのシャットダウンフックで、異なるものがあります。そのうちの1つは、アプリケーションのシャットダウンフックの実行を確実にする責任があります。 で、ではありません。換言すれば、ブロックである。これらのシャットダウンフックの1つは、すべてのアプリケーションシャットダウンフック(自分自身またはリンクされた回答でこのコードをトレースすることができます)を同時に開始し、Thread.joinコールを使用してすべて完了するまでブロックします。そのうちの1つは、アプリケーションシャットダウンフックです。System.exitを呼び出した場合、ロックを得るまでには、Shutdown.classが永久に取得されます。

次に、ダムの答え:代わりにRuntime.getRuntime().halt()を呼び出してください。私は "ダムの答え"と言っています。これはおそらく、あなたが出口の代わりにやってほしいと思っていたわずかに低いレベルのものだからです。 System.exitがクリーンシャットダウンに失敗した場合、haltはハードシャットダウンであり、常に即座に成功します。

次に、スマートな回答:おそらく何もありません。次の理由から、シャットダウンフックを終了させて​​ください。シャットダウンフックはシャットダウンを所有していません。特に、シャットダウンフックが必要な場合があります。逆に、私はこのフックの責任の1つが最終的にハードシャットダウンを強制することであると考えます。私はすぐに遅れた仕事としてそれを作成することをお勧めします。

関連する問題