java利用时间监听器实现定时任务
创建一个Listener监听器,并使用@Component注解注入容器托管
@Component
public class TimerListener implements ServletContextListener {
private Timer timer = null;
@Override
public void contextInitialized(ServletContextEvent event) {
timer = new Timer(true);
event.getServletContext().log("定时器已启动");
//设置执行时间
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 17); // 控制时
calendar.set(Calendar.MINUTE, 55); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
//定制每天的11:00:00执行
java.util.Date date = calendar.getTime();
//每天的date时刻执行TestTask,每隔30秒重复执行
timer.schedule(new TestTask(), date, 1000*30);
//每天的date时刻执行TestTask, 仅执行一次
//timer.schedule(new TestTask(), date);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
if (timer != null) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}
执行的方法TestTask, 需继承TimerTask
public class TestTask extends TimerTask {
protected final Log logger = LogFactory.getLog(getClass());
private static boolean isRunning = false;
@Override
public void run() {
if (!isRunning) {
isRunning = true;
logger.info("开始执行任务。");
//编写执行内容
int i = 0;
while (i < 2) {
logger.info("已完成任务的" + i + "/" + 10);
i++;
}
isRunning = false;
logger.info("任务执行结束。");
} else {
logger.info("上一次任务执行还未结束,本次任务不能执行。");
}
}
}
最后记得在启动类上增加@EnableScheduling注解