tomcat中的java实现定时器
下面的这篇文章对我非常有用
?做web开发也有一段时间,但发现现在有定时器的功能应用得是越来越多,有时我们总是需要在深夜风站访问量低的时候做一些工作,比如说数据转移,有些对账日志的生成,向一些接口平台上传或下载文件,以前在做PHP开发的时候这些任务都是要依懒于服务器的计划任务或者自己写一些应用放到服务器上运行。但最近在做Java开发的时候却发现这一点非常让人满意,我们直接可以用Servlet侦听器结合Java定时器就可以实现这一过程了,简单讲一下这个过程:首先我们需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入 contextInitialized,把销毁的过程置入contextDestroyed了。?
我把ServletContextListener的实现类取名为SysContextListener,在其内添加一个定时器,示例代码如下所示:?
- package?com.lenovo.utils;???
- import?java.util.Timer;//定时器类?import?javax.servlet.ServletContextEvent;?
- import?javax.servlet.ServletContextListener;?public?class?SysContextListener?implements?ServletContextListener?
- {???private?Timer?timer?=?null;?
- ??//重写contextInitialized???public?void?contextInitialized(ServletContextEvent?event)?
- ??{???????//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能?
- ??????timer?=?new?Timer(true);???????//添加日志,可在tomcat日志中查看到?
- ??????event.getServletContext().log("定时器已启动");???????//调用定时任务,0表示任务无延迟,5*1000表示每隔5秒执行任务,触发间隔以毫秒计算。?
- ??????timer.schedule(new?TimerAction(),0,5*1000);????????
- ??????event.getServletContext().log("已经添加任务");???}?
- ??//重写contextDestroyed???public?void?contextDestroyed(ServletContextEvent?event)?
- ??{???????//在这里关闭监听器,所以在这里销毁定时器。?
- ??????timer.cancel();???????event.getServletContext().log("定时器销毁");?
- ??}?}?
以上代码中, timer.schedule(new TimerAction(event.getServletContext()), 0, 5*1000)这一行为定时器调度语句,其中TimerAction是自定义需要被调度的执行任务,默认的情况下是调用run()方法,下面会重点讲述,第三个参数表示执行周期(单位为毫秒),中间参数0表示无延迟。
下面是执行的任务代码:
- package?com.lenovo.utils;??
- import?java.util.TimerTask;??
- public?class?TimerAction?extends?TimerTask?{??
- ????public?void?run()?{??????????
- ????????//此处编写任务内容?????????System.out.println("this?is?a?Timer?action");?
- ?????????????}?
- ?}?
到这儿,ServletContextListener和TimerAction的代码都已完整了,也就是程序执行都已经完成了,到了这儿并没有完成的。我们还需要的j把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中web-app节点中加入如下三行:
- <listener>?????<listener-class>?
- ????????com.lenovo.utils.SysContextListener?????</listener-class>?
- </listener>?
?
这个是从网上抄的: 原链接为: http://www.joyphper.net/article/201107/131.html