54 votes

Existe-t-il un moyen d'exécuter une méthode/classe uniquement au démarrage de Tomcat/Wildfly/Glassfish ?

J'ai besoin de supprimer les fichiers temporaires au démarrage de Tomcat, le passage vers un dossier qui contient des fichiers temporaires est dans applicationContext.xml.

Existe-t-il un moyen d'exécuter une méthode/classe uniquement au démarrage de Tomcat ?

0 votes

UPDATE : J'ai eu un dysfonctionnement temporaire - vous devriez utiliser un ContextListener et non un SessionListener .

81voto

skaffman Points 197885

Vous pourriez écrire un ServletContextListener qui appelle votre méthode depuis le contextInitialized() méthode. Vous attachez le listener à votre webapp dans le web.xml, par ex.

<listener>
   <listener-class>my.Listener</listener-class>
</listener>

et

package my;

public class Listener implements javax.servlet.ServletContextListener {

   public void contextInitialized(ServletContext context) {
      MyOtherClass.callMe();
   }
}

Strictement parlant, ceci n'est exécuté qu'une fois au démarrage de la webapp, plutôt qu'au démarrage de Tomcat, mais cela peut revenir au même.

0 votes

Cette méthode est également portable entre les conteneurs de servlets Java. C'est la meilleure solution à mon avis. D'autres options sont listées ici. blog.eisele.net/2010/12/

0 votes

@skaffman mais pendant le démarrage du serveur tomcat dans eclipse la fonction contextInitialized() est appelée mais MyClass.INSTANCE n'est pas appelée.MyClass est une classe enum et elle crée INSTANCE une fois.Tomcat ne démarre pas. le code est le suivant public void contextInitialized(ServletContextEvent contextEvent) { MongoDBClass.INSTANCE.getSomeDB().getCollection("UserDB"); context = contextEvent.getServletContext(); MongoDBClass.INSTANCE.getSomeDB().getCollection("UserDB"); }

15voto

Vous pouvez également utiliser (à partir de Servlet v3) une approche annotée (il n'est pas nécessaire d'ajouter quoi que ce soit à web.xml) :

   @WebListener
    public class InitializeListner implements ServletContextListener {

        @Override
        public final void contextInitialized(final ServletContextEvent sce) {

        }

        @Override
        public final void contextDestroyed(final ServletContextEvent sce) {

        }
    }

0 votes

Puis-je ajouter le code de démarrage du serveur http dans contextInitialized. Parce qu'après avoir ajouté ce code, je me retrouve avec des exceptions et des erreurs.

3voto

insin Points 19509

Je suis sûr qu'il doit y avoir un meilleur moyen de le faire dans le cadre du cycle de vie du conteneur (edit : Hank a la réponse - je me demandais pourquoi il suggérait un SessonListener avant de répondre), mais vous pouvez créer une servlet qui n'a d'autre but que d'effectuer des actions ponctuelles au démarrage du serveur :

<servlet>
  <description>Does stuff on container startup</description>
  <display-name>StartupServlet</display-name>
  <servlet-name>StartupServlet</servlet-name>
  <servlet-class>com.foo.bar.servlets.StartupServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

3 votes

Avant Servlet 2.4 (ou était-ce 2.3 ?), c'est ce que les gens faisaient. Mais avec l'ajout des listeners de contexte, ce n'est plus nécessaire.

0 votes

C'est bon à savoir - une ancienne application que nous sommes en train de "remanier" (il ne s'agit pas d'une réécriture à partir de zéro avec un meilleur cadre et des exigences qui changent partout, honnêtement !) en ce moment pour fonctionner sur un conteneur 2.4 utilise toujours cette technique.

2voto

Hank Gay Points 36173

UPDATE : J'ai eu un dysfonctionnement temporaire - vous devriez utiliser un ContextListener et non un SessionListener .

0voto

En cas d'exécution sur WildFly/Glassfish, vous pouvez également annoter un EJB @Singleton comme @Startup afin qu'il soit exécuté lors du déploiement de l'application ou lorsque le serveur d'application a démarré.

Voir un exemple dans ce article .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X