package com.lyis.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.lyis.task.NoticeTask;
public class WebContextListener implements ServletContextListener{
private Timer timer;
public void contextDestroyed(ServletContextEvent sce) {
if(timer != null) {
timer.cancel();
}
}
public void contextInitialized(ServletContextEvent sce) {
timer = new Timer();
Calendar calendar = Calendar.getInstance();
// 指定01:00:00点执行
calendar.set(Calendar.HOUR_OF_DAY, 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date = calendar.getTime();
timer = new Timer();
timer.schedule(new NoticeTask(),date);
// 若需循环执行,需改为以下代码
// 任务执行周期(毫秒)
// Long period = Long.valueOf(24 * 60 * 60 * 1000);
// timer.schedule(new NoticeTask(), date, period);
}
}
package com.lyis.task;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
public class NoticeTask extends TimerTask{
public void run() {
System.out.println("定时执行,当前时间:" + getTimeStamp());
}
private String getTimeStamp() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
return sdf.format(new Date());
}
}
如果是循环定时执行还存在一些问题:
假如任务定在09:00:00执行,下一次执行则会受服务启动时间影响
如果在09:00:00之后重启了服务,则下一次任务不是在指定的时间执行,而是服务启动时间,反之则能按指定时间执行任务。