有没有办法只在Tomcat/Wildfly/Glassfish启动时运行方法/类?

问题描述:

我需要删除Tomcat启动时的临时文件,传递给包含临时文件的文件夹位于applicationContext.xml中。有没有办法只在Tomcat/Wildfly/Glassfish启动时运行方法/类?

有没有办法只在Tomcat启动时运行方法/类?

+0

更新:我有一个临时故障 - 你应该使用[ContextListene r](http://www.docjar.com/docs/api/listeners/ContextListener.html),而不是`SessionListener`。 – 2008-10-01 15:59:51

你可以写一个ServletContextListenercontextInitialized()方法调用你的方法。您将侦听程序附加到web.xml中的web应用程序,例如

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

package my; 

public class Listener implements javax.servlet.ServletContextListener { 

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

严格地说,这只是在web应用程序启动时运行一次,而不是Tomcat启动,但可以达到同样的事情。

+0

这也可以通过Java servlet容器移植。我认为最好的方法。 此处列出了其他选项 - http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato 2014-06-18 15:25:06

+0

@skaffman但在eclipse中的tomcat服务器启动时contextInitialized( )函数正在调用,但MyClass.INSTANCE未调用.MyClass是一个枚举类,它创建一次INSTANCE.Tomcat无法启动。代码是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 2015-05-06 06:57:25

我确定在容器生命周期中必须有更好的方法来做它(编辑:汉克有答案 - 我想知道他为什么在我回答之前建议SessonListener),但是您可以创建一个Servlet的其中有没有其他的目的,当服务器启动,而不是执行一次性行动:

<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

在Servlet 2.4之前(或者它是2.3?),人们就是这么做的。但是通过添加上下文监听器,这不再是必要的。 – skaffman 2008-10-01 20:56:24

您也可以使用(开始Servlet的V3)带注释的形式给出(不需要任何补充的web.xml):

@WebListener 
    public class InitializeListner implements ServletContextListener { 

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

     } 

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

     } 
    }