¿Hay alguna manera de ejecutar un método / clase solo en el arranque de Tomcat / Wildfly / Glassfish?

Necesito eliminar archivos temporales en el inicio de Tomcat, el pase a una carpeta que contiene archivos temporales está en applicationContext.xml.

¿Hay alguna manera de ejecutar un método / clase solo en el arranque de Tomcat?

Podría escribir un ServletContextListener que llame a su método desde el método contextInitialized() . Adjunta el oyente a su aplicación web en web.xml, por ejemplo

  my.Listener  

y

 package my; public class Listener implements javax.servlet.ServletContextListener { public void contextInitialized(ServletContext context) { MyOtherClass.callMe(); } } 

Estrictamente hablando, esto solo se ejecuta una vez en el inicio de la aplicación web, en lugar del inicio de Tomcat, pero eso puede equivaler a lo mismo.

También puede usar (iniciando Servlet v3) un enfoque anotado (no es necesario agregar nada 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) { } } 

Estoy seguro de que debe haber una forma mejor de hacerlo como parte del ciclo de vida del contenedor (edit: Hank tiene la respuesta, me preguntaba por qué estaba sugiriendo un SessonListener antes de responder), pero podrías crear un Servlet que no tenga otro propósito que no sea realizar acciones únicas cuando se inicia el servidor:

  Does stuff on container startup StartupServlet StartupServlet com.foo.bar.servlets.StartupServlet 1