2009-10-11 8 views

Répondre

52

Utiliser 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> 
+12

** Encore plus facile maintenant ... ** L'annotation ['@ WebListener'] (http://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebListener.html) ajoutée à [Servlet 3.0 spec] (https://jcp.org/en/jsr/detail?id=315) vous donne maintenant ce comportement sans avoir la peine d'éditer le fichier web.xml. Voir cette illumination [réponse par BalusC] (http://stackoverflow.com/a/9186070/642706). –

14

Pourquoi voulez-vous faire spécifiquement lors de l'arrêt? Et avez-vous vraiment besoin de pour l'enregistrer (comme dans "est-ce absolument critique?") Ou comme à (comme dans "serait bien mais je vais vivre sans")?

La distinction est importante - peu importe la méthode que vous essayez (auditeur servlet/contexte tel que suggéré par d'autres réponses ou JVM shutdown hook) il y a aucune garantie qu'il sera effectivement invoqué.

Les événements de destruction de l'écouteur de servlet/contexte ne sont déclenchés que pendant l'arrêt normal (gracieux) du conteneur OU pendant le rechargement de l'application. Le crochet d'arrêt de la JVM serait également déclenché pendant l'interruption du processus; cependant tuer un processus (ou couper le pouvoir) ne déclencherait évidemment aucun des deux.

+1

Il est dans la catégorie "serait bien mais je vais vivre sans". Je dois enregistrer un tas de statuts de serveurs que mon application tente de se connecter à un fichier (et non pas db) lorsque l'application est arrêtée, puis recharger ces informations lorsque l'application est relancée. Si mon application tente de se connecter à un serveur et qu'elle est en panne, elle le marque comme étant désactivé afin de ne pas devoir réessayer. Étant donné que les requêtes se produisent souvent, je ne marque ces états qu'en mémoire, pas dans le fichier. Par conséquent, lorsque l'application est arrêtée, il serait bon de se rappeler quels serveurs sont en panne. – user121196

+0

Je me penche vers ServletContextListener ou JVM hook – user121196

+5

N'utilisez pas un hook JVM - c'est plus pour Tomcat lui-même, ou pour les applications de bureau. Vous devriez certainement préférer un ServletContextListener sur un hook JVM. –

3

Je suggère d'utiliser ehcache pour mettre en cache cette information. Si vous utilisez le stockage persistant d'ehcache, lorsque vous redémarrerez Tomcat, les données mises en cache seront toujours disponibles. En effet, cela délègue le problème à ehcache, qui est optimisé pour ces types de problèmes.

11

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

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

Voir Spring beans factory lifecycle.