web-dev-qa-db-fra.com

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 à un dossier contenant des fichiers temporaires se trouve dans applicationContext.xml.

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

52
dcave555

Vous pouvez écrire un ServletContextListener qui appelle votre méthode à partir de la méthode contextInitialized(). Vous attachez l'écouteur à votre webapp dans 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 parler, cela n'est exécuté qu'une seule fois au démarrage de l'application Web, plutôt qu'au démarrage de Tomcat, mais cela peut équivaloir à la même chose.

77
skaffman

Vous pouvez également utiliser (à partir de Servlet v3) une approche annotée (pas besoin 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) {

        }
    }
15

Je suis sûr qu'il doit y avoir une meilleure façon de le faire dans le cadre du cycle de vie du conteneur (modifier: Hank a la réponse - je me demandais pourquoi il suggérait un SessonListener avant de répondre), mais vous pouvez créer un 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
Jonny Buchanan