Java Webアプリケーションが停止しているとき、またはTomcatが停止しているときに、いくつかのデータを保存する必要があります。これはどのように行うことができますか?編集:jvmシャットダウンフックを使用する場合の欠点はありますか?
4 に答える
web.xmlでServletContextListenerを実装するクラスを使用します。
<web-app>
<!-- Usual stuff here -->
<listener>
<listener-class>com.mycompany.MyClass</listener-class>
</listener>
</web-app>
なぜシャットダウン中に具体的にそれをしたいのですか?そして、あなたは本当にそれを保存する必要がありますか(「それは絶対に重要ですか?」のように)、またはあなたは保存したいですか(「いいでしょうが、私はそれなしで生きます」のように)?
区別は重要です。どの方法を試しても(他の回答やJVMシャットダウンフックで提案されているサーブレット/コンテキストリスナー)、実際に呼び出される保証はありません。
サーブレット/コンテキストリスナーの破棄イベントは、通常の(正常な)コンテナのシャットダウン中、またはアプリケーションのリロード中にのみトリガーされます。JVMシャットダウンフックは、プロセスの中断中にもトリガーされます。ただし、プロセスを強制終了する(または電源を切る)と、明らかにどちらもトリガーされません。
leonmの答えへの追加として:
Spring を使用する場合は、Spring の「ライフサイクル管理」を使用して同様の効果を得ることができます。たとえば、Bean のメソッドにアノテーションを付けて、@PreDestroy
コンテナーのシャットダウン時に自動的に呼び出されるようにすることができます。そうすれば、 に何も入れる必要はありませんweb.xml
。
Spring Bean ファクトリーのライフサイクルを参照してください。
この情報をキャッシュするには、ehcache を使用することをお勧めします。ehcache の永続ストアを使用すると、Tomcat を再起動したときに、キャッシュされたデータを引き続き利用できます。
実際には、これにより問題が ehcache に委任されます。これは、これらのタイプの問題に対して最適化されています。