C'è un modo per eseguire un metodo / classe solo all'avvio di Tomcat / Wildfly / Glassfish?
-
03-07-2019 - |
Domanda
Devo rimuovere i file temporanei all'avvio di Tomcat, il passaggio a una cartella che contiene i file temporanei è in applicationContext.xml.
Esiste un modo per eseguire un metodo / classe solo all'avvio di Tomcat?
Soluzione
Potresti scrivere un ServletContextListener
che chiama il tuo metodo dal metodo contextInitialized ()
. Alleghi l'ascoltatore alla tua webapp in web.xml, ad esempio
<listener>
<listener-class>my.Listener</listener-class>
</listener>
e
package my;
public class Listener implements javax.servlet.ServletContextListener {
public void contextInitialized(ServletContext context) {
MyOtherClass.callMe();
}
}
A rigor di termini, questo viene eseguito solo una volta all'avvio di webapp, anziché all'avvio di Tomcat, ma ciò può equivalere alla stessa cosa.
Altri suggerimenti
Puoi anche usare (avviando Servlet v3) un approccio annotato (non è necessario aggiungere nulla a web.xml):
@WebListener
public class InitializeListner implements ServletContextListener {
@Override
public final void contextInitialized(final ServletContextEvent sce) {
}
@Override
public final void contextDestroyed(final ServletContextEvent sce) {
}
}
Sono sicuro che ci deve essere un modo migliore per farlo come parte del ciclo di vita del contenitore (modifica: Hank ha la risposta - Mi chiedevo perché stesse suggerendo un SessonListener
prima di rispondere) , ma è possibile creare un servlet che non ha altro scopo se non quello di eseguire azioni singole all'avvio del server:
<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>