2011-06-28 17 views
2

現在、JVMをシャットダウンするときにファイルを削除する必要があるtomcat Webアプリケーションがあります。 contextDestroyedイベントを処理するカスタムContextLoaderListenerを作成しました。ここでは、適切なファイルに対してdeleteOnExitを呼び出します。しかし、jdk 1.6.0_14以来、私はOnOExitを削除できません。グーグルは、若干の変更が予想されることを示していますが、私はこれを回避する方法を見ていません。誰でもアイデアはありますか?DeleteOnExit jvm shutdown

以下のコードは機能しません。

for(File f : myFileList) 
try{ 
    f.deleteOnExit() 
} finally { 
    f.delete() 
} 
+0

仮想マシンの正常終了に関係なく、これは起こりますか?また、ファイルのすべてのハンドルも閉じていることを確認してください。 – mre

+1

'File.deleteOnExit'は、シャットダウンハンドラではなく、ファイルを作成するときに呼び出されることに注意してください。要点は、システムが終了したときにファイルを削除するように要求することです(整然とした方法で)。 – sudocode

+2

deleteOnExitが悪い、リークし、期待どおりのファイルでも削除される可能性があります。要するに、それを使わないでください。 (そして最後にはファイルを削除する部分がたくさんあるので、もっと良い結果は得られません) – bestsss

答えて

5

正常なシャットダウンプロセスの一環としてファイルをクリーンアップした結果に満足しているとは思わないでしょう。たとえば、プロセスがクラッシュしたり、 "kill -9"で停止した場合、クリーンアップコードは実行されません。

より信頼できるアプローチは、起動/初期化中に環境を設定することです。このアプリケーションのファイルを特定のディレクトリに分類すると、これは簡単です。ちょうどempty the directoryです。

「空のディレクトリ」呼び出しが所属する場所は、アプリケーションによって異なります。たとえば、サーブレットを作成した場合は、the init methodを使用します。また、Springを使用する場合は、init-methodなどのさまざまな初期化フックを提供します。

+0

問題のディレクトリをいつ空にすることを提案しますか?また、ディレクトリを空にする方法としてどのような方法を提案しますか?彼らはすでに独自のディレクトリに分かれています。プロセスがクラッシュしたり、kill -9が呼び出されたりすると、ディレクトリに移動して空にすることが私たちの心配でありません。通常の日常業務では、Dev環境でコードを4〜5回展開することができるため、適切なクリーンアップ手順がなくても本当に面倒な作業になります。 – Joseph

+2

ファイルを書き込むリソースを初期化するときに、起動時にディレクトリを空にします。スタートアップに夢中になることは非常に信頼性が高く、シャットダウンには本質的に信頼性がありません。 – werkshy