最近因項目需要編寫一個定時採集程式,發現一個非常簡單的部署定時進程的方法——利用接聽程式和定時器。
首先,編寫一個Servlet用於啟動定時器和進行任務調度,參考代碼如下:
import javax.servlet.ServletContextEvent;
public class MyTimer extends javax.servlet.http.HttpServlet implements
javax.servlet.ServletContextListener {
//private static final long serialVersionUID = 1L;
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
System.out.println("定時器已啟動");
timer.schedule(new MyTimerTask(), 0, 24 * 60 * 60 * 1000);
System.out.println("已經新增工作調度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("定時器銷毀");
}
}
其中利用了定時器的java.util.Timer.schedule(TimerTask task, long delay, long period)方法,裡面的參數依次為:任務類,延時(單位毫秒),周期(單位毫秒)。根據我的設定,每24小時運行一次。
然後是任務調度類:
import java.util.Calendar;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = 22;
private static boolean isRunning = false;
@Override
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR < cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
System.out.println("開始執行指定任務");
/*這裡可以是任何代碼*/
isRunning = false;
System.out.println("指定任務執行結束")
}
} else {
System.out.println("上一次任務執行還未結束");
}
}
}
其中C_SCHEDULE_HOUR為執行任務的時段,根據我的要求是每天22點後才執行我的採集程式。
最後是配置接聽程式:
在web.xml中添加以下代碼,當然Servlet名要換成真實的。
<listener>
<listener-class>com.test.MyTimer</listener-class>
</listener>
重點:
1監聽器在開啟伺服器的時候就初始化了.
配置為:
<listener>
<listener-class>com.pp.MyTimer</listener-class>
</listener>
public class MyTimer extends HttpServlet implements ServletContextListener
{//定時器繼承監聽類.把它設定成10秒執行一次任務
timer.schedule(new MyTimerTask(), 0, 10 * 1000);
..
}
2.
這樣在伺服器啟動10秒後會自動執行MyTimeTask.
public class MyTimerTask extends TimerTask {
public void run() {...}