2008-10-01 11 views
44

Ich muss temporäre Dateien beim Tomcat-Start entfernen, die Übergabe an einen Ordner, der temporäre Dateien enthält, befindet sich in applicationContext.xml.Gibt es eine Möglichkeit, eine Methode/Klasse nur beim Start von Tomcat/Wildfly/Glassfish auszuführen?

Gibt es eine Möglichkeit, eine Methode/Klasse nur beim Start von Tomcat auszuführen?

+0

UPDATE: Ich hatte eine vorübergehende Fehlfunktion - Sie sollten eine [ContextListene verwenden r] (http://www.docjar.com/docs/api/listeners/ContextListener.html), kein 'SessionListener'. –

Antwort

70

Sie könnten eine ServletContextListener schreiben, die Ihre Methode von der contextInitialized() Methode aufruft. Sie hängen den Listener an Ihre Webanwendung in web.xml an, z.

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

und

package my; 

public class Listener implements javax.servlet.ServletContextListener { 

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

Streng genommen ist dies nur einmal auf Webapp Start ausgeführt wird, anstatt Tomcat-Start, aber das auf dasselbe hinaus betragen kann.

+0

Dies ist auch über Java-Servlet-Container hinweg portierbar. Der beste Weg meiner Meinung nach. Andere Optionen sind hier aufgeführt - http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato

+0

@skaffman aber während der Tomcat-Server in Eclipse startet contextInitialized () Funktion ruft auf, aber MyClass.INSTANCE ruft nicht auf.MyClass ist eine Enum-Klasse, die INSTANCE once.Tomcat nicht erstellen kann. der Code ist '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

Ich bin mir sicher, dass es einen besseren Weg gibt, es als Teil des Lebenszyklus des Containers zu tun (bearbeiten: Hank hat die Antwort - ich fragte mich, warum er schlug eine SessonListener, bevor ich antwortete), aber Sie könnten ein erstellen Servlets, die keinen anderen Zweck hat als einmalige Aktionen auszuführen, wenn der Server gestartet wird:

<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

Bevor Servlet 2.4 (oder war es 2,3?), Das ist, was die Leute taten. Mit dem Hinzufügen von Kontext-Listenern ist dies jedoch nicht mehr notwendig. – skaffman

+0

Das ist gut tp know - eine Legacy-Anwendung, die wir "refactoring" (es ist keine Neuschreibung von Grund auf mit einem besseren Rahmen und Anforderungen ändern überall, ehrlich!) Im Moment auf einem 2.4 Container zu laufen ist immer noch mit dieser Technik. –

9

Sie auch (ab Servlet v3) eine kommentierte aproach (keine Notwendigkeit, etwas zu web.xml hinzufügen) verwenden können:

@WebListener 
    public class InitializeListner implements ServletContextListener { 

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

     } 

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

     } 
    } 
+0

Kann ich http-Server-Startcode innerhalb von ContextInitialized hinzufügen. Denn nach dem Hinzufügen ist das mit Ausnahme und Fehlern vermischt – Hema