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

Posted

技术标签:

【中文标题】有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?【英文标题】:Is there a way to run a method/class only on Tomcat/Wildfly/Glassfish startup? 【发布时间】:2010-09-14 13:45:21 【问题描述】:

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

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

【问题讨论】:

更新:我遇到了临时故障 - 您应该使用 ContextListener,而不是 SessionListener 【参考方案1】:

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

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

package my;

public class Listener implements javax.servlet.ServletContextListener 

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

严格来说,这只是在 webapp 启动时运行一次,而不是在 Tomcat 启动时运行一次,但这可能相当于同一件事。

【讨论】:

这也可以跨 Java servlet 容器移植。在我看来最好的方法。此处列出了其他选项-blog.eisele.net/2010/12/… @skaffman 但是在 eclipse 中的 tomcat 服务器启动期间 contextInitialized() 函数正在调用但 MyClass.INSTANCE 没有调用。MyClass 是一个枚举类,它创建一次实例。Tomcat 无法启动。代码是public void contextInitialized(ServletContextEvent contextEvent) MongoDBClass.INSTANCE.getSomeDB().getCollection("UserDB"); context = contextEvent.getServletContext(); MongoDBClass.INSTANCE.getSomeDB().getCollection("UserDB"); 【参考方案2】:

我确信作为容器生命周期的一部分,必须有更好的方法来做到这一点(编辑:汉克有答案 - 我想知道他为什么在我回答之前建议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?)之前,人们就是这样做的。但是随着上下文侦听器的添加,这不再是必要的了。 这很好 tp 知道 - 我们正在“重构”一个遗留应用程序(它不是从头开始重写,具有更好的框架和需求在各处改变,老实说!)在 2.4 容器上运行仍在使用此技术。【参考方案3】:

您还可以使用(从 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) 

        
    

【讨论】:

我可以在 contextInitialized 中添加 http 服务器启动代码吗?因为添加后我搞砸了异常和错误

以上是关于有没有办法只在 Tomcat/Wildfly/Glassfish 启动时运行方法/类?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法只在 C# 中设置一次属性

有没有办法只在 C# 中设置一次属性

有没有办法让控制器只在iOS中出现(也许在macOS中)?

有没有办法让 CURRENT_TIMESTAMP 只在数据库中存储日期、小时和分钟?

有没有办法只在新文件上运行 lint-staged (之前 git 未跟踪的文件)

我只在 iPhone 上开发了一个应用程序,现在我想要相同的应用程序通用,有没有办法在 Xcode 上转换它?