[英]Is there a way to run a method/class only on Tomcat/Wildfly/Glassfish startup?
我需要在 Tomcat 啟動時刪除臨時文件,傳遞到包含臨時文件的文件夾在 applicationContext.xml 中。
有沒有辦法只在 Tomcat 啟動時運行方法/類?
您可以編寫一個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 啟動時運行,但這可能等同於同一件事。
您還可以使用(從 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) {
}
}
作為容器生命周期的一部分,我確信一定有更好的方法來做到這一點(編輯:Hank 有答案 - 我想知道他為什么在我回答之前建議使用SessonListener
),但是您可以創建一個沒有除了在服務器啟動時執行一次性操作之外的其他目的:
<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>
如果在 WildFly/Glassfish 上運行,您還可以將 @Singleton EJB 注釋為 @Startup,以便在應用程序部署或應用程序服務器啟動時執行。
請參閱本文中的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.