好多朋友用過Windows的任務計劃也有不少程序迷自己曾寫過時鐘報警系統自動關機等趣味程序可卻很少有朋友在Web工程中實現過類似功能
當Web工程啟動時定時器能自動開始計時在整個Web工程的生命期裡定時器能在每晚深夜觸發一次任務因此定時器的存放位置也值得考查不能簡單的存在於單個Servlet或JavaBean中必須能讓定時器宿主的存活期為整個Web工程生命期在工程啟動時能自動加載運行結合這兩點跟 Servlet上下文有關的偵聽器就最合適不過了通過在工程的配置文件中加以合理配置會在工程啟動時自動運行並在整個工程生命期中處於監聽狀態
下面就Servlet偵聽器結合Java定時器來講述整個實現過程要運用Servlet偵聽器需要實現 javaxservletServletContextListener接口同時實現它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個接口函數考慮定時器有個建立和銷毀的過程看了前面兩個接口函數就不容置疑的把建立的過程置入 contextInitialized把銷毀的過程置入contextDestroyed了
我把ServletContextListener的實現類取名為ContextListener在其內添加一個定時器示例代碼如下所示
import javautilTimer;
import javaxservletServletContextEvent;
import javaxservletServletContextListener;
import javaxservletServletException;
import javaxservletServletRequest;
import javaxservletServletResponse;
import javaxservlethttpHttpServlet;
public class ContextListener
extends HttpServlet
implements ServletContextListener {
public ContextListener() {
}
private javautilTimer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new javautilTimer(true);
eventgetServletContext()log(定時器已啟動);
timerschedule(new MyTask(eventgetServletContext()) **);
eventgetServletContext()log(已經添加任務調度表);
}
public void contextDestroyed(ServletContextEvent event) {
timercancel();
eventgetServletContext()log(定時器銷毀);
}
}
以上代碼中 timerschedule(new MyTask(eventgetServletContext()) **)這一行為定時器調度語句其中MyTask是自定義需要被調度的執行任務(在我的財政數據中心項目中就是報表計算引擎入口)從 javautilTimerTask繼承下面會重點講述第三個參數表示每小時(即**毫秒)被觸發一次中間參數表示無延遲其它代碼相當簡單不再詳細說明
下面介紹MyTask的實現上面的代碼中看到了在構造MyTask時傳入了javaxservletServletContext類型參數是為記錄Servlet日志方便而傳入因此需要重載MyTask的構造函數(其父類javautilTimerTask原構造函數是沒有參數的)在timerschedule()的調度中設置了每小時調度一次因此如果想實現調度任務每小時被執行一次還需要判斷一下時鐘點以常量C_SCHEDULE_HOUR表示(晚上點也即點)同時為防止小時執行下來任務還未執行完(當然一般任務是沒有這麼長的)避免第二次又被調度以引起執行沖突設置了當前是否正在執行的狀態標志isRunning示例代碼如下所示
import javautil*;
import javaxservletServletContextEvent;
import javaxservletServletContextListener;
import javaxservletServletException;
import javaxservletServletRequest;
import javaxservletServletResponse;
import javaxservlethttpHttpServlet;
import javaxservlet*;
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = ;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask() {
}
public MyTask(ServletContext context) {
ntext = context;
}
public void run() {
Calendar cal = CalendargetInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == calget(CalendarHOUR_OF_DAY)) {
isRunning = true;
contextlog(開始執行指定任務);
//TODO 添加自定義的詳細任務以下只是示例
//系統定時接收郵件
Email email=new Email();
emailrecieve();
isRunning = false;
contextlog(指定任務執行結束);
}
}
else {
contextlog(上一次任務執行還未結束);
}
}
}
到這兒ServletContextListener和MyTask的代碼都已完整了最後一步就是把ServletContextListener部署到您的Web工程中去在您工程的webxml配置文件中加入如下三行
<listener>
<listenerclass>comtestContextListener</listenerclass>
</listener>
當然上面的comtest得換成您自己的包名了保存webxml文件後把工程打包部署到Tomcat中即可任務會在每晚點至凌晨點之間被執行
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26421.html