web-dev-qa-db-ja.com

Java Webアプリケーションのシャットダウンフック

Java Webアプリケーションが停止したとき、またはTomcatが停止したとき、データを保存する必要があります。これを行う方法は?編集:jvmシャットダウンフックを使用する場合の欠点

38
user121196

Web.xmlで ServletContextListener を実装するクラスを使用します。

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

シャットダウン中に具体的にそれを行うのはなぜですか?そして、あなたは本当にneedを保存しますか(「絶対にクリティカルですか?」のように)、あなたはlikeになりますか(「would be nice but I liveそれなしで」)?

区別は重要です-どのメソッドを試しても(他の回答で示唆されているサーブレット/コンテキストリスナーまたは JVMシャットダウンフック )、実際には呼び出される保証なしがあります。

サーブレット/コンテキストリスナーの破棄イベントは、通常の(正常な)コンテナシャットダウン中にのみトリガーされますORアプリケーションのリロード中。アウトパワー)は明らかにどちらもトリガーしません。

15
ChssPly76

レオンの答えへの追加として:

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

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

11
sleske

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

実際、これは問題をehcacheに委任し、ehcacheはこれらのタイプの問題に最適化されています。

3
Steve McLeod