¿Hay alguna forma de ejecutar un método/clase solo en Tomcat / Wildfly / Glassfish startup?


Necesito eliminar archivos temporales al iniciar Tomcat, el paso a una carpeta que contiene archivos temporales está en ApplicationContext.XML.

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

Author: Kukeltje, 2008-10-01

3 answers

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

<listener>
   <listener-class>my.Listener</listener-class>
</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 webapp, en lugar de Tomcat startup, pero eso puede equivaler a lo mismo.

 74
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 09:22:38

También puede usar (iniciando Servlet v3) un enfoque anotado (sin necesidad de 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) {

        }
    }
 12
Author: Alexander Drobyshevsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-22 19:56:04

Estoy seguro de que debe haber una mejor manera de hacerlo como parte del ciclo de vida del contenedor (editar: Hank tiene la respuesta - Me preguntaba por qué estaba sugiriendo un SessonListener antes de que respondiera), pero podría crear un Servlet que no tiene otro propósito que realizar acciones de una sola vez cuando se inicia el servidor:

<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> 
 3
Author: Jonny Buchanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-01 16:08:34