Tomcat下的定時任務


  1. package axtic.servlet;
  2. // 下面就Servlet偵聽器結合Java定時器來講述整個實現過程。要運用Servlet偵聽器需要實現 javax.servlet.ServletContextListener接口,同時實現它的 contextInitialized(ServletContextEvent event)和 contextDestroyed(ServletContextEvent event)兩個接口函數。考慮定時器有個建立和銷毀的過程,看了前面兩個接口函數,就不容置疑的把建立的過程置入contextInitialized,把銷毀的過程置入contextDestroyed了
  3. import java.util.Timer;//定時器
  4. import axtic.bean.exportHistoryBean;
  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.ServletContextListener;
  7. public class SysContextListener implements ServletContextListener
  8. {
  9. private Timer timer = null;
  10. public void contextInitialized(ServletContextEvent event)
  11. {//在這里初始化監聽器,在tomcat啟動的時候監聽器啟動,可以在這里實現定時器功
  12. timer = new Timer(true);
  13. event.getServletContext().log("定時器已啟動");//添加日志,可在tomcat日志中查看到
  14. timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//調用exportHistoryBean,0表示任務無延遲,5*1000表示每隔5秒執行任務,60*60*1000表示一個小時。
  15. event.getServletContext().log("已經添加任務");
  16. }
  17. public void contextDestroyed(ServletContextEvent event)
  18. {//在這里關閉監聽器,所以在這里銷毀定時器。
  19. timer.cancel();
  20. event.getServletContext().log("定時器銷毀");
  21. }
  22. }

接下來可以編寫自己的功能類,此類一定要extends定時器類中TimerTask .下面介紹TimerTask的實現,上面的代碼中看到了在構造Timer Task時,傳入了javax.servlet.ServletContext類型參數,是為記錄Servlet日志方便而傳入,因此需要重載Timer Task的構造函數(其父類java.util.TimerTask原構造函數是沒有參數的)。在timer.schedule()的調度中,設置了每小時調度一次,因此如果想實現調度任務每24小時被執行一次,還需要判斷一下時鍾點,以常量C_SCHEDULE_HOUR 表示(晚上12點,也即0點)。同時為防止24小時執行下來,任務還未執行完(當然,一般任務是沒有這么長的),避免第二次又被調度以引起執行沖突,設置了當前是否正在執行的狀態標志isRunning。示例代碼如下所示:

Java代碼  收藏代碼
  1. package axtic.bean;
  2. import java.util.Calendar;
  3. import java.util.TimerTask;
  4. import javax.servlet.ServletContext;
  5. public class exportHistoryBean extends TimerTask
  6. {
  7. private static final int C_SCHEDULE_HOUR = 0;
  8. private static boolean isRunning = false;
  9. private ServletContext context = null;
  10. public exportHistoryBean(ServletContext context)
  11. {
  12. this.context = context;
  13. }
  14. public void run()
  15. {
  16. Calendar c = Calendar.getInstance();
  17. if(!isRunning)
  18. {
  19. if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))
  20. {
  21. isRunning = true;
  22. context.log("開始執行指定任務");
  23. //-------------------開始保存當日歷史記錄
  24. //在這里編寫自己的功能,例:
  25. //File file = new File("temp");
  26. //file.mkdir();
  27. //啟動tomcat,可以發現在tomcat根目錄下,會自動創建temp文件夾
  28. //-------------------結束
  29. isRunning = false;
  30. context.log("指定任務執行結束");
  31. }
  32. else
  33. {
  34. context.log("上一次任務執行還未結束");
  35. }
  36. }
  37. }
  38. }

最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中

Xml代碼  收藏代碼
  1. <web-app>
  2. <listener>
  3. <listener-class>
  4. axtic.servlet.SysContextListener
  5. </listener-class>
  6. </listener>
  7. <servlet/>
  8. <servlet-mapping/>
  9. </web-app>

這個J2EE小提示闡述了ServletContextListener的用法。這個事件類作為Web應用程序的一部分,處理Web應用程序的 servlet上下文(context)的變化的通知。這可以解釋為,好像有個人在服務器旁不斷地通知我們服務器在發生什么事件。那當然需要監聽者了。因此,在通知上下文(context)初始化和銷毀的時候,ServletContextListner非常有用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM