public class CheckSevicesDateTaskListener implements ServletContextListener {
public CheckSevicesDateTaskListener() {
}
private Timer timer = null;
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer(true);
sce.getServletContext().log("啟動定時器");
// 設定時間
Calendar ca = Calendar.getInstance();
int year = ca.get(ca.YEAR);
int month = ca.get(ca.MONTH);
int day = ca.get(ca.DAY_OF_MONTH);
// 每天的凌晨二點執行
ca.set(year, month, day, 2, 00, 00);
Date date = ca.getTime();
int period = 24 * 60 * 60 * 1000;
timer.schedule(new CheckSevicesDateTimerTask(sce.getServletContext()), date, period);
sce.getServletContext().log("已經添加任務調度表");
updateFileRecordState();
}
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
sce.getServletContext().log("定時器銷毀");
}
public void updateFileRecordState() {
UmDBManager.updateFileRecordState(1,2);
}
}
求大神怎么解決,每次部署都會執行一次定時任務,而不是到2:00再執行。。。
uj5u.com熱心網友回復:
int day = ca.get(ca.DAY_OF_MONTH);----------因為這行導致除非你是在凌晨0:00-1:59之間啟動的服務,否則就會導致你一啟動服務就執行定時任務。修改成
int day = ca.get(ca.DAY_OF_MONTH) + 1;----------確保第二天的凌晨2:00執行
如果是一個月的最后一天或者一年的最后一天,自行修改年月的資訊
這樣啟動時就不會執行了,直到第二天的2點才會執行
-----------------------------------------------------------
如果還不放心,加個判斷獲取應用部署啟動時的24時制下的hour資料,如果是小于2,則設定為int day = ca.get(ca.DAY_OF_MONTH);
如果是大于2,則設定為int day = ca.get(ca.DAY_OF_MONTH) + 1;
-----------------------------------------------------------
另外現在已經沒有人通過這種方式注冊定時任務了,不好管理,可以研究下分布式的elastic job
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/284936.html
標籤:Java EE
上一篇:如何遍歷JTextField里的路徑用JList形式輸出
下一篇:怎么提一個好問題