Java Web定时器使用(转载)

  • 格式:doc
  • 大小:117.50 KB
  • 文档页数:18

这个类最终功能是每天某个时间点(如每晚22点)执行某一功能.首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期.要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是类设计:public class TimerListener implements ServletContextListener { private Timer timer = null;private SampleTask sampleTask;@Overridepublic void contextDestroyed(ServletContextEvent event) { timer.cancel();event.getServletContext().log("定时器销毁");}@Overridepublic void contextInitialized(ServletContextEvent event) { timer = new Timer(true);sampleTask = new SampleTask(event.getServletContext()); event.getServletContext().log("定时器已启动");timer.schedule(sampleTask, 0, 60 * 60 * 1000);event.getServletContext().log ("已经添加任务调度表");}}public class SampleTask extends TimerTask {private ServletContext context;private static boolean isRunning = false;private static boolean flag = true;private static final int C_SCHEDULE_HOUR = 15;public SampleTask(ServletContext context){this.context = context;}@Overridepublic void run() {Calendar cal = Calendar.getInstance();if (!isRunning) {if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && flag) {isRunning = true;context.log("开始执行指定任务");//需要执行的代码isRunning = false;flag = false;context.log("指定任务执行结束");}} else {context.log("上一次任务执行还未结束");}if(C_SCHEDULE_HOUR != cal.get(Calendar.HOUR_OF_DAY)){flag = true;}}}要使用此监听器需要在web.xml中配置,如下:<listener><listener-class>包路径.TimerListener</listener-class></listener>这样在web工程启动时,就会自动启动此监听器.JAVA中Timer定时器调度方法java timer中的时间调度方法主要有:schedule(TimerTask task, Date firstTime, long period)Schedules the specified task for repeated fixed-delay execution, beginning at the specified time.但是如果此时的firstTime小于(时间落后于)当前时间,那么task会立即执行,在调试的时候不方便,因为程序一启动就开始执行了,或许还没有到任务的触发点。

schedule(TimerTask task, long delay, long period)Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay.如果采用设置delay时间的方法,则可以进行处理。

比如:设置执行时间为每天的13:50,如果启动的时候时间已经过了13:35,那么应该在明天的13:35进行执行。

此时可以这样处理:Calendar cal = Calendar.getInstance();cal.set(Calendar.HOUR_OF_DAY, 13);cal.set(Calendar.MINUTE, 35);//cal.add(Calendar.DAY_OF_MONTH, 1);Date date = new Date();date = cal.getTime();Date now = new Date();long interval = date.getTime() - now.getTime();//should exec in next dayif (interval < 0) {cal.add(Calendar.DAY_OF_MONTH, 1);date = cal.getTime();interval = date.getTime() - now.getTime();}System.out.println("the interval time is: " + interval); //the exec time interval is 2 secs.timer.schedule(echoTask, interval, 2 * 1000);如果delay的时间为负数,会报异常,因此,Calendar添加一天。

JAVA WEB程序中添加定时器//这是我的定时器类,用来定时执行某段任务;package com.my.time;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;public class BugXmlTimer {public Timer timer;public void timerStart(){timer = new Timer();Date datetime=new Date();Date midnightDate=new Date();SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {midnightDate = sdf2.parse(sdf1.format(datetime)+" 23:00:00");} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}long in=midnightDate.getTime()-datetime.getTime(); System.out.println("before task");//立刻执行,然后每隔30s执行一次timer.schedule(new BugXmlTimerTask(), 0,30000);}public void timerStop(){if(timer!=null)timer.cancel();}public static void main(String[] args){ BugXmlTimer myTimer=new BugXmlTimer();// TODO Auto-generated method stubmyTimer.timerStart();}}//这是执行任务的类,即每隔一段时间要做的事情在这里package com.my.time;import java.util.TimerTask;public class BugXmlTimerTask extends TimerTask { @Overridepublic void run() {System.out.print("run task");}}//以下是出发定时操作的类,该类实现了ServletContextListenerpublic class MyTimerListener implements ServletContextListener {private BugXmlTimer mytimer = new BugXmlTimer ();public void contextInitialized(ServletContextEvent event) {mytimer.timerStart();}public void contextDestroyed(ServletContextEvent event) {mytimer.timerStop();}}然后在web.xml里部署一下,即可在程序启动后运行定时器了!<listener><listener-class>com.my.time.MyTimerListener </listener-class></listener>Java 定时器退出解决方案项目中用到了Timer每隔一段时间进行一些操作,现在发现有时候莫名其妙地挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现这个定时器线程也不在了(定时器创建的时候带了名字Timer timer = new Timer("MyTimer"),所以直接能看到),由于日志太多,之前的日志已经找不到了,所以没有办法看是否是有异常发生以及发生在哪里。