定时器
监听器
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("上一次任务执行还未结束"); } } }