以前用JDK的Timer实现过定时同步用户数据,今日看到Timer相关的一个例子,实现每隔10分钟检测一次用户是否有新邮件抵达,调度只在每天早上9:00到下午6:00进行。
一. 建立任务: import java.util.TimerTask; import java.util.Calendar; public class MyTask extends TimerTask { private static final int C_SCHEDULE_HOUR = 15; private static boolean isRunning = false; public MyTask() { } public void run() { Calendar cal = Calendar.getInstance(); if (!isRunning) { //if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) { isRunning = true; System.out.println(new java.util.Date() + " 任务开始"); for (int i = 0 ; i < 100 ; i++ ) { System.out.println(new java.util.Date() + " 任务完成" + i + "/" + 100 ); } isRunning = false; System.out.println(new java.util.Date() + " 所有任务完成!"); } } else { System.out.println(new java.util.Date() + " 任务退出!!!"); } } } 注意:Timer类并不支持每天每段时间的调度,因此代码中使用Calendar类获取当前时间,比较当前时间与系统需要调度的时间段。 二. 调度任务 本应用的计时器随应用的启动而启动,一次可以设计成load-on-startup的servlet,也可以设计成listener,一般设计成listener,本例中采用该方法。 任务调督的listener如下: import java.util.TimerTask; import java.util.Timer; import javax.servlet.*; public class ScheduleListener implements ServletContextListener { private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent sce) { timer = new Timer(true); sce.getServletContext().log(new java.util.Date() + "计时器已经启动"); System.out.println(new java.util.Date() + " 计时器已经启动"); timer.schedule(new MyTask() , 0 , 2*60*1000);//每4分钟执行一次 sce.getServletContext().log(new java.util.Date() + "计时器执行一次!!!!!"); System.out.println(new java.util.Date() + " 计时器执行一次!!!!!"); } public void contextDestroyed(ServletContextEvent sce) { timer.cancel(); sce.getServletContext().log(new java.util.Date() + "计时器被销毁!!!"); System.out.println(new java.util.Date() + " 计时器被销毁!!!"); } } 三.在web.xml加载该listener,配置文件如下: <?xml version="1.0" encoding="ISO-8859-1"?> 应用启动后,该listener随着启动,负责加载Timer实例。<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java./dtd/web-app_2_3.dtd"> <web-app> <!-- 此处配置listener--> <listener> <listener-class>ScheduleListener</listener-class> </listener> </web-app> |
|
来自: 昵称21365845 > 《未命名》