java定時任務,每天定時執行任務(JDK TimerTask)

01 public class TimerManager {
02  
03  //時間間隔
04  private static final long PERIOD_DAY = 24 60 60 1000;
05   
06  public TimerManager() {
07   Calendar calendar = Calendar.getInstance();
08         
09   /*** 定製每日2:00執行方法 ***/
10  
11   calendar.set(Calendar.HOUR_OF_DAY, 2);
12   calendar.set(Calendar.MINUTE, 0);
13   calendar.set(Calendar.SECOND, 0);
14    
15   Date date=calendar.getTime(); //第一次執行定時任務的時間
16    
17   //如果第一次執行定時任務的時間 小於 當前的時間
18   //此時要在 第一次執行定時任務的時間 加一天,以便此任務在下個時間點執行。如果不加一天,任務會立即執行。
19   if (date.before(new Date())) {
20       date = this.addDay(date, 1);
21   }
22    
23   Timer timer = new Timer();
24    
25   NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
26   //安排指定的任務在指定的時間開始進行重複的固定延遲執行。
27   timer.schedule(task,date,PERIOD_DAY);
28  }
29  
30  // 增加或減少天數
31  public Date addDay(Date date, int num) {
32   Calendar startDT = Calendar.getInstance();
33   startDT.setTime(date);
34   startDT.add(Calendar.DAY_OF_MONTH, num);
35   return startDT.getTime();
36  }
37   
38 }


在 TimerManager 這個類裏面,大家一定要注意 時間點的問題。如果你設定在凌晨2點執行任務。但你是在2點以後
發佈的程序或是重啓過服務,那這樣的情況下,任務會立即執行,而不是等到第二天的凌晨2點執行。爲了,避免這種情況
發生,只能判斷一下,如果發佈或重啓服務的時間晚於定時執行任務的時間,就在此基礎上加一天。


01 public class NFDFlightDataTimerTask extends TimerTask {
02  
03  private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);
04  
05  @Override
06  public void run() {
07   try {
08    //在這裏寫你要執行的內容
09     
10   catch (Exception e) {
11    log.info("-------------解析信息發生異常--------------");
12   }
13  }
14 }
15  
16 public class NFDFlightDataTaskListener implements ServletContextListener {
17   
18  public void contextInitialized(ServletContextEvent event) {
19   new TimerManager();
20  }
21  
22  public void contextDestroyed(ServletContextEvent event) {
23  }
24  
25 }


然後要在web.xml裏面配置監聽器

1 <listener>
2  <listener-class>
3   com.listener.NFDFlightDataTaskListener
4  </listener-class>
5 </listener>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章