Java Web定时器使用(转载)

上传人:cn****1 文档编号:470093215 上传时间:2022-09-28 格式:DOCX 页数:18 大小:33.63KB
返回 下载 相关 举报
Java Web定时器使用(转载)_第1页
第1页 / 共18页
Java Web定时器使用(转载)_第2页
第2页 / 共18页
Java Web定时器使用(转载)_第3页
第3页 / 共18页
Java Web定时器使用(转载)_第4页
第4页 / 共18页
Java Web定时器使用(转载)_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《Java Web定时器使用(转载)》由会员分享,可在线阅读,更多相关《Java Web定时器使用(转载)(18页珍藏版)》请在金锄头文库上搜索。

1、这个类最终功能是每天某个时间点(如每晚22点)执行某一功能.首先介绍java定时器(java.u til .Timer )有定时执行计划任务的功能,通过设定定时器的 间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.u til. TimerTask)如 :每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);schedule方法的第一个参数是需要执行的任务,此类的类型为java.u til.TimerTask, 第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒 由于我们希望当Web工程启动时

2、,定时器能自动开始计时,这样在整个Web工程的生命期 里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启 动定时器,通过在配置文件里配置此监听器,让其在工程启动时自动加载运行,存活期为整个 Web工程生命期.要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是类 设计:public class TimerListener implements ServletContextListener private Timer timer = null;private SampleTask samp

3、leTask;0verridepublic 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(定时器

4、已启动);timer.schedule(sampleTask, 0, 60 * 60 * 1000);event.getServletContext().log (已经添加任务调度表);public class SampleTask extends TimerTask privateServletContext context;privatestatic boolean isRunning = false;privatestatic boolean flag = true;privatestatic final int C_SCHEDULE_HOUR = 15;public SampleTas

5、k(ServletContext context) this.context = context;Overridepublic void run() Calendar cal = Calendar.getlnstance();if (!isRunning)& flag)if ( C SCHEDULE HOUR = cal.get(Calendar. HOUR OF DAY) isRunning = true;context.log(开始执行指定任务”);/需要执行的代码isRunning = false;flag = false; context .log(指定任务执行结束);else con

6、text .log(上一次任务执行还未结束);要使用此监听器需要在web.xml中配置,如下:listenerlistener-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, beginnin

7、g 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,如果

8、启动的时候时间已经过了 13: 35,那 么应该在明天的13: 35进行执行。此时可以这样处理:Calendar cal = Calendar.ge tlnst ance();cal.se t(Calendar.HOUR_OF_DAY, 13);cal.se t( Calendar.MINUTE, 35); /cal.add(Calendar.DAY_OF_MONTH, 1);Date date = new Dat e();date = cal.ge tTime();Date now = new Dat e();long int erval = dat e.ge tTime() - now.g

9、e tTime(); /should exec in next dayif (interval 0) cal.add(Calendar.DAY_OF_MONTH, 1); date = cal.ge tTime();int erval = dat e.ge tTime() - now.ge tTime();System.out .println(the interval time is: + interval); /the exec time interval is 2 secs.ti mer.schedule(echoTask, int erval, 2 * 1000);如果delay的时间

10、为负数,会报异常,因此,Calendar添加一天。JAVA WEB程序中添加定时器/这是我的定时器类,用来定时执行某段任务;package com.my .ti me;import java .text .ParseException;import java .text .SimpleDateFormat;import java. util.Date;import java. util.Timer;public class BugXmlTimer public Timer timer;public void ti merS tart()ti mer = new Timer();Date dat

11、eti me=new Dat e();Date midnigh tDat e=new Dat e();SimpleDateFormat sdf1 = new SimpleDateFormat(yyyy-MM-dd);SimpleDateFormat sdf2 = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);try midnigh tDate = sdf2.parse(sdf1.forma t(dateti me)+ 23:00:00); catch (ParseException e) / TODO Auto-generated catch blocke

12、.pri ntSt ackTrace();long in二midnigh tDat e.ge tTime()-da teti me.ge tTime();Sys tem.o ut .pri ntln (before t ask);/立刻执行,然后每隔30s执行一次ti mer.schedule(new BugXmlTimerTask(), 0,30000);public void ti merS to p()if(ti mer!二null)ti mer.cancel();public static void main(S tring args)BugXmlTimer myTimer二new B

13、ugXmlTimer();/ TODO Auto-generated method stubmyTimer .ti merS tart();/这是执行任务的类,即每隔一段时间要做的事情在这里 package com.my .ti me;import java. util.TimerTask;public class BugXmlTimerTask extends TimerTask Overridepublic void run() Sys tem.o ut .pri nt( run t ask);/以下是出发定时操作的类,该类实现了 ServletContextListenerpublic

14、class MyTimerListener implements ServletContextListener private BugXmlTimer mytimer = new BugXmlTimer ();public void contextlnitialized(ServletContextEvent event) myti mer .ti merS tart();public void contextDestroyed(ServletContextEvent event) myti mer .ti merS to p();然后在web.xml里部署一下,即可在程序启动后运行定时器了!

15、com.my .time.MyTimerListener Java定时器退出解决方案项目中用到了 Timer每隔一段时间进行一些操作,现在发现有时候莫名其妙地 挂在这个计时器上的操作都不做了,用“JConsole”查看其中的线程以后,发现 这个定时器线程也不在了(定时器创建的时候带了名字Timer timer = new Timer(MyTimer),所以直接能看到),由于日志太多,之前的日志已经找不到 了,所以没有办法看是否是有异常发生以及发生在哪里。初步估计,是不是由于 TimerTask中有异常抛出,如果定时器中没有处理的话,可能就会出问题。所以 看了一下 java. util.Timer 的代码:1. /在TimerThread中执行任务2. Timer.java:101:TimerThread3. / TimerThread

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 电气技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号