以前用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() + " 任务退出!!!");
}
}
}
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() + " 计时器被销毁!!!");
}
}
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"
?>
<! DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
<!-- 此处配置listener -->
< listener >
< listener-class > ScheduleListener </ listener-class >
</ listener >
</ web-app >
<! DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
< web-app >
<!-- 此处配置listener -->
< listener >
< listener-class > ScheduleListener </ listener-class >
</ listener >
</ web-app >