2008-10-01 7 views
44

J'ai besoin de supprimer les fichiers temporaires au démarrage de Tomcat, le passage à un dossier qui contient 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/Wildfly/Glassfish?

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

+0

MISE À JOUR: J'ai eu un dysfonctionnement temporaire - vous devriez utiliser un [ContextListene r] (http://www.docjar.com/docs/api/listeners/ContextListener.html), pas un 'SessionListener'. –

Répondre

70

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 exemple.

<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(); 
    } 
} 

à proprement parler, cela est exécuté qu'une seule fois au démarrage webapp, plutôt que le démarrage Tomcat, mais qui peut équivaloir à la même chose.

+0

Ceci est également portable sur les conteneurs de servlets Java. La meilleure façon à mon avis. D'autres options sont listées ici- http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato

+0

@skaffman mais pendant le serveur tomcat dans eclipse démarre contextInitialized () function appelle mais MyClass.INSTANCE n'appelle pas.MyClass est une classe enum et crée une INSTANCE une fois.Tomcat ne démarre pas. le code est 'public void contextInitialized (ServletContextEvent contextEvent) { \t MongoDBClass.INSTANCE.getSomeDB(). getCollection (" UserDB "); \t context = contextEvent.getServletContext(); \t MongoDBClass.INSTANCE.getSomeDB(). GetCollection ("UserDB"); \t \t \t} ' – Vicky

3

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 (edit: Hank a la réponse - je me demandais pourquoi il suggérait un SessonListener avant de répondre), mais vous pourriez créer un servlet qui n'a pas d'autre but que d'effectuer des actions ponctuelles lorsque le serveur est démarré:

<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> 
+2

Avant Servlet 2.4 (ou était-ce 2.3?), C'est ce que les gens ont fait. Mais avec l'ajout d'auditeurs de contexte, ce n'est plus nécessaire. – skaffman

+0

C'est bon tp savoir - une application héritée nous "refactoring" (ce n'est pas une réécriture à partir de la base avec un meilleur cadre et les exigences changeant partout, honnête!) Au moment de courir sur un conteneur de 2,4 est encore en utilisant cette technique. –

9

Vous pouvez également utiliser (à partir servlet v3) une aproche 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) { 

     } 
    } 
+0

Puis-je ajouter le code de démarrage du serveur http dans contextInitialized. Parce que après avoir ajouté cela est foiré avec des exceptions et des erreurs – Hema

Questions connexes