2009-10-11 18 views
37

Java Webアプリケーションが停止しているときや、Tomcatが停止しているときに、いくつかのデータを保存する必要があります。どのようにこれを行うことができますか? 編集: 私はjvmのシャットダウンフックを使用して任意の欠点?あなたがシャットダウン中に、具体的にそれを行うにはしたくないのはなぜJava Webアプリケーションのシャットダウンフック

<web-app> 
    <!-- Usual stuff here --> 
    <listener> 
     <listener-class>com.mycompany.MyClass</listener-class> 
    </listener> 
</web-app> 

答えて

52

は、あなたのweb.xmlにServletContextListenerを実装するクラスを使用しますか?そして、実際にを保存する必要がありますか(「それは絶対的に重要ですか?」)、のようになります(「いいでしょうが、私はそれなしで生きます」)?

区別は重要ではない - に関係なく(他の回答やJVM shutdown hookにより示唆されるように、サーブレット/コンテキストリスナーを)あなたがしようと何の方法、それが実際に呼び出されること保証はありません。

サーブレット/コンテキストリスナの破棄イベントは、通常の(優雅な)コンテナのシャットダウン中またはアプリケーションのリロード中にのみトリガされます。 JVMのシャットダウンフックは、プロセスの中断中にも起動されます。プロセスを殺すこと(または電源を切ること)は、明らかにどちらも引き起こさないでしょう。

+12

**さらに簡単に... ** ['@ WebListener'](http://docs.oracle.com/java//servlet/annotation/WebListener.html)アノテーションが[サーブレット3.0仕様](https://jcp.org/ja/jsr/detail?id=315)では、web.xmlを編集しなくてもこの動作が可能になりました。この照明[BalusCによる回答](http://stackoverflow.com/a/9186070/642706)を参照してください。 –

14

+1

それは "いいですが、私はそれなしで生きる"カテゴリーです。私は、アプリケーションがシャットダウンされたときに私のアプリケーションがファイル(dbではない)に接続しようとしているサーバの状態を保存し、アプリケーションが再び起動されたときにこれらの情報をリロードする必要があります。私のアプリケーションがサーバーに接続しようとしているときにサーバーがダウンしている場合は、もう一度やり直す必要がないように、アプリケーションを停止しているとマークします。クエリはたびに発生するため、私はこれらのステータスをファイルではなくメモリに記録します。したがって、アプリケーションがシャットダウンしたときに、どのサーバーが停止しているかを覚えておくとよいでしょう。 – user121196

+0

私はServletContextListenerまたはJVMフックの方に傾いています – user121196

+5

JVMフックを使用しないでください。それはTomcat自体やデスクトップアプリケーションのためです。あなたは間違いなくJVMフック上でServletContextListenerを好むべきです。 –

3

この情報をキャッシュするには、ehcacheを使用することをおすすめします。 ehcacheの永続ストアを使用している場合、Tomcatを再起動すると、キャッシュされたデータは引き続き使用できます。

これは、問題をこれらのタイプの問題に最適化されたehcacheに委譲します。 leonmの答えへの追加として

11

:あなたが春を使用している場合

、あなたは同様の効果を達成するために、Springの「ライフサイクル管理」を使用することができます。たとえば、Bean内のメソッドに@PreDestroyというアノテーションを付けて、コンテナのシャットダウン時に自動的に呼び出させることができます。そうすれば、web.xmlに何かを入れる必要はありません。

Spring beans factory lifecycleを参照してください。

関連する問題