ライセンス数が限られているライセンスサーバーからライセンスオブジェクトを取得または解放する方法があるライセンス付きAPIを使用しています。私のアプリケーションの冒頭で、私はライセンスを取得するメソッドを呼び出しますが、私はプログラムが終了/突然クラッシュ(例外、SIGTERMなど)がリリースされていることを確認したい。シャットダウンフックはこの問題に近づける最善の方法ですか?Javaアプリケーションを終了する前にコードを確実に実行する方法
答えて
で「最後の防御線」を作成します。 JVMがクラッシュしたり、SIGKILLを取得したりすると、終了する前に何かを実行する機会はありません。このシナリオでは、Javaでこれを修正するために何もできません。 (ただし、状況は他の言語でも同じです...)
しかし、JVMが非ダメージスレッドの終了に応答して正常にシャットダウンした場合、System.exit()を呼び出してSIGINTを取得するなど、JVMはシャットダウン・フックの実行を試みます。 Q&Aページとjavadocsには、Javaのシャットダウンフックメカニズムの詳細があります。
finally
のアプローチもオプションですが、問題のスレッドがJVMが終了する前に終了する場合にのみ有効です。 System.exit()
が呼び出された場合、またはJVMがシグナルによって終了した場合は、これは発生しません。シャットダウンフックはより多くの状況で機能します。
(私にとって、finally
は、アプリケーション全体ではなく、単一のスレッドでクリーンで実行することです。ただし、アプリケーションが1つのスレッドだけで構成されている場合、または規則的に責任を負うマスタースレッドがある場合シャットダウン... finally
は、アプリケーションクリーンアップの目的に役立ちます。)
真の解決策は、ライセンスを使用して、アプリケーションのインスタンスがそれを解放せずになくなったときにライセンスマネージャが検出できるように、ライセンスのAPIを設定することです。これが可能かどうかは、ライセンスマネージャによって異なります。
プログラムがJVMのクラッシュによって終了した場合、呼び出されているものに依存することはできません。
プログラムがJVMに関係しない例外によって終了した場合、try/catch/finallyブロック内のすべてをラップすることができます。 finallyブロック内のコードは、コードが終了する前に実行されることが保証されます。
例外の場合、main
の本文をtry/catch/block
にラップすることができます。 SIGTERM
信号を処理する場合は、add a shutdown hookとすることができます。ただし、シャットダウンフックは、SIGKILL
のような信号に対してトリガされる保証はありません。 Java docから
:
まれな状況では、仮想マシンがを中止することがあり、それは、きれいにシャットダウンせずに実行している を停止しています。これは仮想マシン が外部で終了した場合、たとえばUnixでは
SIGKILL
シグナル 、Microsoft WindowsではTerminateProcess
コールで終了します。たとえば、 が内部データ構造を破壊したり、存在しないメモリ にアクセスしようとすると、ネイティブメソッドが異常終了した場合でも、仮想マシン が中断することがあります。 仮想マシンが異常終了すると、シャットダウンフックが実行されるかどうかについて、 という保証はありません。
これは決してSytem.exit()を呼び出さないことで実現します。メインで ()あなたは@thedanハードJVMがクラッシュに関する正しいです
try {
startApp();
} catch (Exception ex) {
// do some logging
} finally {
releaseLicense();
}
- 1. アプリケーションがasp.net mvcで終了するときにコードを実行する方法
- 2. 前のコードが終了する前に実行されるJava関数
- 3. JNI - ネイティブスレッドの実行が終了する前にJavaが終了する
- 4. QUnitでユニットテストを実行する前にデータベースクエリが確実に終了する方法
- 5. Pythonでプロセスを終了する直前にコードを実行するには?
- 6. Androidアプリケーションを実行してUnityアクティビティを終了する方法
- 7. 実行中のアプリケーションのインスタンスを確認して終了する
- 8. Expectスクリプト - 終了時にコードを実行
- 9. アプリの終了時にコードを実行
- 10. 角度4の終了時に確認を実行する方法は?
- 11. キュウリシナリオ実行ごとにブラウザの終了と終了を停止する方法
- 12. iphoneでアプリケーション終了後にバックグラウンドスレッドを実行するには?
- 13. Java Runtime、アプリケーションの終了時に何らかのアクションを実行
- 14. アプリを終了した後にスウィフトコードを実行する方法
- 15. プログラム終了時の接続を確実に閉じる方法
- 16. TextEditorEdit.replaceは非同期で、終了時にコードを実行する方法は?
- 17. 終了前にアニメーション完了ブロックを実行しますか?
- 18. シグナルハンドラが確実に終了してからプログラムを続行する方法を確認するには?
- 19. javascript終了後に関数を再実行する方法
- 20. パスフェイルテストケースをカウントして実行終了時にプリントする方法
- 21. 終了せずにbashスクリプトを実行する方法
- 22. SSISパッケージの実行が終了する前に終了します
- 23. Spark Streamingでマイクロバッチが終了する前にアクションを実行
- 24. リクエストがRestKitで終了する前後に関数を実行
- 25. アプリケーション終了時にバックグラウンドタスクを実行する
- 26. アンドロイドスタジオでデバッグ中にコード実行を終了する
- 27. popen()edプロセスが終了時にデストラクタを確実に実行する方法を教えてください。
- 28. Javascript forEachが実行を完了した後にコードを実行する方法
- 29. ロジックが実行される前にプログラムが終了する
- 30. C++アプリケーションを終了する前にバックグラウンドスレッドを終了させる
「最後に」クローラを意味しましたか? –