web-dev-qa-db-fra.com

crochet d'arrêt pour Java

J'ai besoin de sauvegarder certaines données de préférence lorsque l'application Web Java est arrêtée ou lorsque Tomcat est arrêté. Comment cela peut-il être fait? Edit: tout inconvénient si j'utilise le crochet d'arrêt jvm?

39
user121196

Utilisez une classe qui implémente ServletContextListener dans votre web.xml:

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

Pourquoi voulez-vous le faire spécifiquement pendant l'arrêt? Et avez-vous vraiment besoin de le sauvegarder (comme dans "est-ce absolument critique?") Ou aimeriez-vous à (comme dans "serait bien mais je vivrais sans")?

La distinction est importante - quelle que soit la méthode que vous essayez (servlet/écouteur de contexte comme suggéré par d'autres réponses ou hook d'arrêt JVM ) il n'y a aucune garantie qu'il sera effectivement invoqué.

Les événements de destruction de servlet/écouteur de contexte ne seraient déclenchés que lors de l'arrêt normal (gracieux) du conteneur OR lors du rechargement de l'application. le pouvoir) ne déclencherait évidemment aucun des deux.

15
ChssPly76

En complément de la réponse de leonm:

Si vous utilisez Spring, vous pouvez utiliser la "gestion du cycle de vie" de Spring pour obtenir un effet similaire. Par exemple, vous pouvez annoter une méthode dans un bean avec @PreDestroy pour qu'il soit invoqué automatiquement à l'arrêt du conteneur. De cette façon, vous n'avez rien à mettre dans le web.xml.

Voir Cycle de vie de l'usine de haricots de printemps .

11
sleske

Je suggère d'utiliser ehcache pour mettre en cache ces informations. Si vous utilisez le magasin persistant d'ehcache, lorsque vous redémarrerez Tomcat, les données mises en cache seront toujours disponibles.

En fait, cela délègue le problème à ehcache, qui est optimisé pour ces types de problèmes.

3
Steve McLeod