有没有办法只在Tomcat/Wildfly/Glassfish启动时运行方法/类?
我需要删除Tomcat启动时的临时文件,传递给包含临时文件的文件夹位于applicationContext.xml中。有没有办法只在Tomcat/Wildfly/Glassfish启动时运行方法/类?
有没有办法只在Tomcat启动时运行方法/类?
你可以写一个ServletContextListener
从contextInitialized()
方法调用你的方法。您将侦听程序附加到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启动,但可以达到同样的事情。
这也可以通过Java servlet容器移植。我认为最好的方法。 此处列出了其他选项 - http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato 2014-06-18 15:25:06
@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>
在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) {
}
}
更新:我有一个临时故障 - 你应该使用[ContextListene r](http://www.docjar.com/docs/api/listeners/ContextListener.html),而不是`SessionListener`。 – 2008-10-01 15:59:51