J2EE定時(shí)采集程序
Posted on 2009-04-08 09:44 ZhouFeng 閱讀(649) 評(píng)論(0) 編輯 收藏 所屬分類: 轉(zhuǎn)載 、Web開(kāi)發(fā)最近因項(xiàng)目需要編寫(xiě)一個(gè)定時(shí)采集程序,于是就到網(wǎng)上找了一下相關(guān)的資料,最后發(fā)現(xiàn)一個(gè)非常簡(jiǎn)單的部署定時(shí)進(jìn)程的方法——利用偵聽(tīng)器和定時(shí)器。
首先,編寫(xiě)一個(gè)Servlet用于啟動(dòng)定時(shí)器和進(jìn)行任務(wù)調(diào)度,參考代碼如下:
然后是任務(wù)調(diào)度類:
最后是配置偵聽(tīng)器:
在web.xml中添加以下代碼,當(dāng)然Servlet名要換成真實(shí)的
首先,編寫(xiě)一個(gè)Servlet用于啟動(dòng)定時(shí)器和進(jìn)行任務(wù)調(diào)度,參考代碼如下:
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("定時(shí)器已啟動(dòng)");
timer.schedule(new MyTimerTask(), 0, 24 * 60 * 60 * 1000);
System.out.println("已經(jīng)添加任務(wù)調(diào)度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("定時(shí)器銷毀");
}
}
其中利用了定時(shí)器的java.util.Timer.schedule(TimerTask task, long delay, long period)方法,里面的參數(shù)依次為:任務(wù)類,延時(shí)(單位毫秒),周期(單位毫秒)。根據(jù)我的設(shè)定,每24小時(shí)運(yùn)行一次。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("定時(shí)器已啟動(dòng)");
timer.schedule(new MyTimerTask(), 0, 24 * 60 * 60 * 1000);
System.out.println("已經(jīng)添加任務(wù)調(diào)度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("定時(shí)器銷毀");
}
}
然后是任務(wù)調(diào)度類:
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("開(kāi)始執(zhí)行指定任務(wù)");
/* Your Code */
isRunning = false;
System.out.println("指定任務(wù)執(zhí)行結(jié)束");
}
} else {
System.out.println("上一次任務(wù)執(zhí)行還未結(jié)束");
}
}
}
其中C_SCHEDULE_HOUR為執(zhí)行任務(wù)的時(shí)段,根據(jù)我的要求是每天22點(diǎn)后才執(zhí)行我的采集程序。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("開(kāi)始執(zhí)行指定任務(wù)");
/* Your Code */
isRunning = false;
System.out.println("指定任務(wù)執(zhí)行結(jié)束");
}
} else {
System.out.println("上一次任務(wù)執(zhí)行還未結(jié)束");
}
}
}
最后是配置偵聽(tīng)器:
在web.xml中添加以下代碼,當(dāng)然Servlet名要換成真實(shí)的
<listener>
<listener-class>com.test.MyTimer</listener-class>
</listener>
就這樣,只需三步,一個(gè)簡(jiǎn)單的定時(shí)采集進(jìn)程就搞定了
<listener-class>com.test.MyTimer</listener-class>
</listener>