在應用開發中,經常需要一些周期性的操作,比如每5分鐘執行某一操作等。這次,在我們的開發中,就有這麼一個需求.某個功能執行需要的時間比較長,則決定采用定時器的方式,每隔一段時間系統自動執行此功能,當界面真正觸發時,隻需要簡單的讀取結果,而不需要執行復雜的邏輯判斷.那如何實現此功能呢?要想實現它,首先我們需要認識瞭解幾個jdk封裝的類.
Java.util.Timer:一種線程設施,用於安排以後再後臺線程中執行的任務.可安排任務執行一次或者定期重復執行.其中幾個方法需要我們註意一下:
cancel():終止此計時器,丟棄所有當前已安排的任務.
schedule(TimerTask task, Date time) :安排在指定的時間執行指定的任務。
schedule(TimerTask task, Date firstTime, long period):安排指定的任務在指定的時間開始進行重復的固定延遲執行。
schedule(TimerTask task, long delay):安排在指定延遲後執行指定的任務。
schedule(TimerTask task, long delay, long period) :安排指定的任務從指定的延遲後開始進行重復的固定延遲執行。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period) :安排指定的任務在指定的時間開始進行重復的固定速率執行。
scheduleAtFixedRate(TimerTask task, long delay, long period) :安排指定的任務在指定的延遲後開始進行重復的固定速率執行。
在上面提到的Timer的幾個方法中,參數中都涉及到瞭TimerTask類.那TimerTask類是幹嘛的呢?他就是Timer所安排的任務.即被設置的要執行一次或多次的任務.這個類中下面這幾個方法需要我們多加註意.
cancel():取消此計時器任務。
run():此計時器任務要執行的操作。這裡是具體操作的代碼實現.
通過Timer和TimerTask兩個類,我們就能實現任務的重復執行瞭.但是,我們並沒有事情執行的起止點.我們不要人為的去觸發事情的執行,我們要通過代碼讓服務自己去執行.這樣,我們就需要一個監聽,去監聽當前是否符合執行的條件.ServletContextListener為我們實現此功能.此接口能夠監聽ServletContext對象的生命周期,實際上就是監聽Web應用的生命周期.當Servlet容器啟動或終止Web應用時,會觸發ServletContextEvent事件,該事件由ServletContextListener來處理.涉及到的兩個方法為:
contextInitialized(ServletContextEvent sce);初始化;
contextDestroyed(ServletContextEvent sce)銷毀
到這裡,準備工作就做好瞭.下面我們來看一個例子定時器具體是怎樣實現的.
[java]
package com.boco.transnms.server.bo.stat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class NFDFlightDataTaskListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
//銷毀時的代碼
}
@Override
//在服務啟動時,執行此方法。
public void contextInitialized(ServletContextEvent arg0) {
new TimerManager();
}
}
//要執行的任務
class NFDFlightDataTimerTask extends TimerTask{
@Override
//此方法為具體要定時操作的方法
public void run() {
System.out.println("定時器測試:"+System.currentTimeMillis());
}
}
class TimerManager{
private static final long PERIOD_DAY=6 * 1000; //每隔六秒執行一次
public TimerManager() {
Timer timer = new Timer(); //定時器實例化
NFDFlightDataTimerTask task = new NFDFlightDataTimerTask(); //要執行的任務
//安排指定的任務在指定的時間開始進行重復的固定延遲執行。
timer.schedule(task,new Date(),PERIOD_DAY);
}
}
package com.boco.transnms.server.bo.stat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class NFDFlightDataTaskListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
//銷毀時的代碼
}
@Override
//在服務啟動時,執行此方法。
public void contextInitialized(ServletContextEvent arg0) {
new TimerManager();
}
}
//要執行的任務
class NFDFlightDataTimerTask extends TimerTask{
@Override
//此方法為具體要定時操作的方法
public void run() {
System.out.println("定時器測試:"+System.currentTimeMillis());
}
}
class TimerManager{
private static final long PERIOD_DAY=6 * 1000; //每隔六秒執行一次
public TimerManager() {
Timer timer = new Timer(); //定時器實例化
NFDFlightDataTimerTask task = new NFDFlightDataTimerTask(); //要執行的任務
//安排指定的任務在指定的時間開始進行重復的固定延遲執行。
timer.schedule(task,new Date(),PERIOD_DAY);
}
}
既然監聽是在服務啟動的時候就有瞭,自然離不開配置文件瞭。那web.xml配置文件是如何配置的呢?
[html] view plaincopyprint?<listener>
<!—此處為實現監聽接口的完整的包名類名–>
<listener-class>
com.boco.transnms.server.bo.stat.NFDFlightDataTaskListener
</listener-class>
</listener>
<listener>
<!—此處為實現監聽接口的完整的包名類名–>
<listener-class>
com.boco.transnms.server.bo.stat.NFDFlightDataTaskListener
</listener-class>
</listener>