1. 程式人生 > >實現tomcat啟動時自動執行程式碼

實現tomcat啟動時自動執行程式碼

方法1:tomcat 自動執行servlet

寫一個servlet,在init()方法中寫好想要執行的程式,程式如下:

eclipse新建一個web\Dynamic Web Project , name = myweb1 , 把tomcat中的 servlet-api.jar複製到lib中,新建一個類MyServlet.Java, 繼承 javax.servlet.HttpServlet,程式碼如下:

  1. package org.cai;  
  2. import javax.servlet.ServletException;  
  3. import javax.servlet.http.HttpServlet;  
  4. publicclass MyServlet extends HttpServlet {  
  5.     @Override
  6.     publicvoid init() throws ServletException {  
  7.         // TODO Auto-generated method stub
  8.         super.init();  
  9.         System.out.println("自動載入啟動.");  
  10.         System.out.println("自動載入啟動.");  
  11.         for(int i = 0; i < 10; i++){  
  12.             System.out.println(i + "、 自動載入啟動."
    );  
  13.         }  
  14.     }  
  15. }  

同時,在web.xml配置檔案內容如下:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID"version="2.5">
  3.   <display-name>myweb1</display-name>
  4.   <welcome-file-list>
  5.     <welcome-file>index.jsp</welcome-file>
  6.   </welcome-file-list>
  7.   <servlet>
  8.    <servlet-name>MyServlet</servlet-name>
  9.    <servlet-class>org.cai.MyServlet</servlet-class>
  10.    <strong><load-on-startup>0</load-on-startup></strong>
  11.   </servlet>
  12.   <servlet-mapping>
  13.    <servlet-name>MyServlet</servlet-name>
  14.    <url-pattern>/</url-pattern>
  15.   </servlet-mapping>
  16. </web-app>

其中<load-on-startup>0</load-on-startup>即可實現tomcat啟動時執行該servlet

load-on-startup的值必須為整數

當load-on-startup值為負整數或者未指定時,容器在該servlet被呼叫時載入

當其值為0和正整數時,容器啟動時載入,值越小,優先順序越高

使用虛擬路徑部署到tomcat中:在 tomcat的 server.xml的 </Host>前加入:

<Context debug="0" docBase="F:/studyworkspace/myweb1/WebRoot" path="myweb1" reloadable="true">
     </Context>

docBase為 myweb1的webroot的路徑 ,path為上下文方法2:Servlet偵聽器

要運用Servlet偵聽器需要實現javax.servlet.ServletContextListener介面,同時實現它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個介面函式。

listener類如下:

  1. package org.cai;  
  2. import javax.servlet.ServletContextEvent;  
  3. import javax.servlet.ServletContextListener;  
  4. publicclass MyListener implements ServletContextListener {  
  5.     private java.util.Timer timer = null ;  
  6.     publicvoid contextDestroyed(ServletContextEvent event) {  
  7.         // TODO Auto-generated method stub
  8.     }  
  9.     publicvoid contextInitialized(ServletContextEvent event) {  
  10.         timer = new java.util.Timer(true) ;  
  11.         event.getServletContext().log("定時器已啟動。") ;  
  12.         timer.schedule(new MyTask(event.getServletContext()), 05000) ;  
  13.         event.getServletContext().log("已經新增任務排程表。" ) ;  
  14.     }  
  15. }  


contextInitialized函式裡的內容將被自動執行
最後在web.xml裡面新增一個監聽節點就行了
  <listener>
   <listener-class>org.cai.MyListener</listener-class>
  </listener>

完整web.xml如下

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"version="2.5">
  3.   <display-name>myweb2</display-name>
  4.   <welcome-file-list>
  5.     <welcome-file>index.jsp</welcome-file>
  6.   </welcome-file-list>
  7.   <listener>
  8.     <listener-class>org.cai.MyListener</listener-class>
  9.   </listener>
  10. </web-app>

如果要執行定時任務,就在自動執行的程式碼裡面使用 java.util.Timer以及建立一個繼承java.util.TimerTask的類。示例:

  1. package org.cai;  
  2. import java.util.TimerTask;  
  3. import javax.servlet.ServletContext;  
  4. public class MyTask extends TimerTask {  
  5.      private static boolean isRunning = false;   
  6.      private ServletContext context = null;   
  7.      public MyTask(ServletContext context){  
  8.          this.context = context ;  
  9.      }  
  10.     @Override  
  11.     public void run() {  
  12.         if (! isRunning){  
  13.             System.out.println("開始執行指定任務.") ;  
  14.             //if (C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {  
  15.                 isRunning = true ;  
  16.                 context.log("開始執行指定任務.") ;  
  17.                 //TODO 新增自定義的詳細任務,以下只是示例   
  18.                 int i = 0;   
  19.                 while (i++ <10) {   
  20.                     context.log("已完成任務的" + i + "/" + 10);   
  21.                     //System.out.println("已完成任務的" + i + "/" + 1000) ;  
  22.                 }   
  23.                 isRunning = false;   
  24.                 context.log("指定任務執行結束");   
  25.                 System.out.println("指定任務執行結束") ;  
  26.             //}  
  27.         }else{  
  28.             context.log("上一次任務執行還未結束");   
  29.         }  
  30.     }  
  31. }  


以上兩種方法部署到tomcat,執行tomcat\bin\startup.bat,即可看到效果,其中方法2中的日誌寫入到tomcat\logs\localhost.xxxx-xx-xx.log檔案中。