监听器
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
/**
* 监听类:监听服务器的启动并将任务添加到任务栈
*/
@WebListener
public class ContextListener implements ServletContextListener{
public ContextListener() {
}
private java.util.Timer timer = null;
/**
* 初始化定时器
* web 程序运行时候自动加载
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
/**
* 设置一个定时器
*/
timer = new Timer(true);
arg0.getServletContext().log("定时器已启动");
/**
* 定时器到指定的时间时,执行某个操作(如某个类,或方法)
*/
//设置执行时间
Calendar calendar =Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
//定制每天的1:00:00执行,
calendar.set(year, month, day, 17, 16, 00);
Date date = calendar.getTime();
// System.out.println(date);
int period = 24 * 60 * 60 * 1000;
//每天的date时刻执行task,每隔persion 时间重复执行
timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date, period);
// 在 指定的date时刻执行task, 仅执行一次
// timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date);
arg0.getServletContext().log("已经添加任务调度表");
}
/**
* 当服务器停止时,定时器销毁
*/
@Override
public void contextDestroyed(ServletContextEvent arg0){
timer.cancel();
arg0.getServletContext().log("定时器销毁");
}
}
任务
import javax.servlet.ServletContext;
import java.util.TimerTask;
/**
* 定时器任务类:主要是继承 TimerTask并实现它的run 方法
*/
public class AutoReceiptJob extends TimerTask {
private static boolean isRunning = false;
private ServletContext context = null;
public AutoReceiptJob() {
super();
}
public AutoReceiptJob(ServletContext context) {
this.context = context;
}
int count = 1;
@Override
public void run() {
if (!isRunning) {
context.log("开始执行指定任务");
/**
* 自己的业务代码
*/
System.out.println("定时器运行了" + count + "次");
count++;
isRunning = false;
context.log("指定任务执行结束");
} else {
context.log("上一次任务执行还未结束");
}
}
}
来源:https://www.cnblogs.com/FishDream/p/11058432.html