2008-10-01 20 views
44

Potrzebuję usunąć pliki tymczasowe podczas uruchamiania Tomcat, przejście do folderu zawierającego pliki tymczasowe znajduje się w pliku applicationContext.xml.Czy istnieje sposób uruchomienia metody/klasy tylko w starcie Tomcat/Wildfly/Glassfish?

Czy istnieje sposób, aby uruchomić/metoda klasy tylko podczas uruchamiania Tomcat?

+0

AKTUALIZACJA: Miałem tymczasową awarię - powinieneś użyć [ContextListene r] (http://www.docjar.com/docs/api/listeners/ContextListener.html), a nie 'SessionListener'. –

Odpowiedz

70

Mogłeś napisać ServletContextListener który wywołuje metodę od metody contextInitialized(). Dołączasz słuchacza do swojej aplikacji webowej w web.xml, np.

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

i

package my; 

public class Listener implements javax.servlet.ServletContextListener { 

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

Ściśle mówiąc, to jest uruchamiany tylko raz podczas uruchamiania webapp, zamiast uruchamiania Tomcat, ale może wynieść do tej samej rzeczy.

+0

To jest również przenośne w kontenerach serwletu Java. Najlepszy sposób w mojej opinii. Inne opcje znajdują się tutaj- http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato

+0

@skaffman ale podczas serwer Tomcat w Eclipse (zaczyna contextInitialized) funkcja wywołuje, ale MyClass.INSTANCE nie wywołuje. Moja klasa to klasa wyliczeniowa i tworzy ona INSTANCE raz.Tomcat nie uruchamia się. kod jest '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

Jestem pewien, że musi istnieć lepszy sposób na zrobienie tego w ramach cyklu życia kontenera (edycja: Hank ma odpowiedź - zastanawiałem się, dlaczego sugerował SessonListener zanim odpowiedziałem), ale możesz stworzyć aplet, który nie ma innego celu niż wykonywanie czynności jednorazowych, gdy serwer jest uruchamiany:

<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

Przed Servlet 2.4 (lub było to 2,3?), Że to, co ludzie zrobili. Ale dodając słuchaczy kontekstu, nie jest to już konieczne. – skaffman

+0

To dobrze tp know - aplikacja spuścizna jesteśmy „refaktoryzacji” (nie jest to przepisać od podstaw z lepszych ram i wymagań zmieniających się w każdym miejscu, uczciwy!) W momencie uruchomienia na 2,4 pojemnika jest nadal używając tej techniki. –

9

można również użyć (poczynając Servlet v3) W adnotacją aproach (nie trzeba dodawać nic do 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

Czy mogę dodać kod początkowy serwera http w contextInitialized. Ponieważ po dodaniu tego jestem pomieszany z wyjątkiem i błędami – Hema