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

Java 有没有办法只在Tomcat/Wildfly/Glassfish启动时运行方法/类?,java,tomcat,jakarta-ee,web-applications,startup,Java,Tomcat,Jakarta Ee,Web Applications,Startup,我需要在Tomcat启动时删除临时文件,传递到包含临时文件的文件夹的路径位于applicationContext.xml中 有没有办法只在Tomcat启动时运行方法/类?您可以编写一个ServletContextListener从contextInitialized()方法调用您的方法。将侦听器附加到web.xml中的webapp,例如 <listener> <listener-class>my.Listener</listener-class> <

我需要在Tomcat启动时删除临时文件,传递到包含临时文件的文件夹的路径位于applicationContext.xml中


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

您可以编写一个
ServletContextListener
contextInitialized()
方法调用您的方法。将侦听器附加到web.xml中的webapp,例如

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

严格地说,这只在webapp启动时运行一次,而不是在Tomcat启动时运行一次,但这可能意味着同样的事情。

我确信,作为容器生命周期的一部分,一定有更好的方法来实现这一点(编辑:Hank有答案-我想知道在我回答之前他为什么建议使用
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> 

在容器启动时做什么
StartupServlet
StartupServlet
com.foo.bar.servlets.StartupServlet
1.
您还可以使用(启动Servlet v3)带注释的aproach(无需向web.xml添加任何内容):


如果在WildFly/Glassfish上运行,还可以将@Singleton EJB注释为@Startup,以便在应用程序部署时或应用程序服务器启动时执行它


参见本文中的一个示例。

在Servlet2.4之前(或者是2.3?),人们就是这么做的。但是,随着上下文侦听器的增加,这不再是必要的。这是一个好的tp know-我们正在“重构”的遗留应用程序(这不是一个从头重写,有更好的框架和各地不断变化的需求,老实说!)目前,在2.4容器上运行仍然使用这种技术,这也可以跨JavaServlet容器移植。在我看来,这是最好的办法。此处列出了其他选项-@skaffman,但在eclipse中的tomcat服务器启动期间,contextInitialized()函数正在调用,但MyClass.INSTANCE没有调用。MyClass是一个枚举类,它创建了一次实例。tomcat无法启动。代码是
public void contextInitialized(servletcontextent){MongoDBClass.INSTANCE.getSomeDB().getCollection(“UserDB”);context=contextent.getServletContext();MongoDBClass.INSTANCE.getSomeDB().getCollection(“UserDB”);}
我可以在contextInitialized中添加http服务器启动代码吗。因为在添加了这个之后,异常和错误被弄乱了:我有一个临时故障-你应该使用一个,而不是一个
会话监听器。
<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> 
   @WebListener
    public class InitializeListner implements ServletContextListener {

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

        }

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

        }
    }