需求:服务器启动后,每月定时执行某些任务
一、实现思路:
1、设置监听器实现ServletContextListener接口
2、在contextInitialized方法中写定时任务,此方法监听的是ServletContext的创建,在ServletContext创建的时候调用此方 法。
二、代码
import org.springframework.web.context.support.WebApplicationContextUtils;
public class TimerMannger extends HibernateDaoSupport implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("%%%%%%% 服务器停止 %%%%%%%");
}
@Override
public void contextInitialized(final ServletContextEvent event) {
System.out.println("---- 监听器初始化 ----");
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);//获得当前年
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
//定制每天的8点执行
calendar.set(year,month,day,8,00,00);
Date defaultDate = calendar.getTime();
Date sendDate = new Date();
if (defaultDate.before(new Date())) {
//将发送时间设置为明天8点
calendar.add(Calendar.DATE, 1);
sendDate = calendar.getTime();
} else {
sendDate = defaultDate;
}
/*
* 每刻任务:
* 启动服务器后,如此时时间没有过8点,等待,到了八点执行一次,15分钟后在执行一次,周而复始
* 启动服务器后,如此时时间已经过8点,立刻执行一次,15分钟后在执行一次,周而复始
* 到了第二天,不会再判断是否是8点,这个开始时间只会判断一次
*/
Timer qTimer = new Timer();
/*
* qTimer.schedule(参数一,参数二,参数三)
* 参数一:所要安排的任务。
* 参数二:首次执行任务的时间。
* 参数三:执行各后续任务之间的时间间隔,单位是毫秒。
*/
qTimer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("每刻任务在执行");
}
},sendDate,15*60*1000);
/*
* 每月任务:
*
*/
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
//每月1号开始执行
Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println("月检查中....");
if (day == 1) {
System.out.println("每月任务执行中....");
}
}
},sendDate,24*60*60*1000);//每天执行检查
}
}