标签: Java定时器
2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报
 分类:
JAVA(24) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

java web 项目中 简单定时器实现 Timer

项目背景: 系统中有一个存放压缩文件的临时文件夹。当时间长了后 存放文件多了,占用磁盘空间过大 让费资源, 所以需要定期去清理临时文件夹下的文件。所以最先想到了使用定时器来实现该功能。

调查:  通过查阅资料  了解到使用java实现这个功能 有三种方法

1》使用Quartz  框架   这是一个开源的任务调度框架

2》 使用 ScheduledExecutor 实现

3》 使用 timer 实现

因为我这只是要实现一个简单定时清理临时文件夹的任务 不需要太多复杂的东西。 所以 我选择了第三种方案 自己使用jdk 自带的 timer 类来实现。

任务类  主要的业务代码

  1. package com.sxl;
  2. import java.util.TimerTask;
  3. import javax.servlet.ServletContext;
  4. /**
  5. * 定时器
  6. * @author sxl
  7. *
  8. */
  9. public class DelFileTask extends TimerTask{
  10. private static boolean isRunning = false;
  11. private ServletContext context = null;
  12. public DelFileTask() {
  13. super();
  14. }
  15. public DelFileTask(ServletContext context) {
  16. this.context = context;
  17. }
  18. @Override
  19. public void run() {
  20. if (!isRunning) {
  21. context.log("开始执行指定任务");
  22. /**
  23. * 自己的业务代码
  24. */
  25. isRunning = false;
  26. context.log("指定任务执行结束");
  27. } else {
  28. context.log("上一次任务执行还未结束");
  29. }
  30. }
  31. }

这个类 主要是继承 TimerTask并实现它的run 方法

下面就是监听类了 监听服务器的启动并将任务添加到任务栈

  1. package com.sxl;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import javax.servlet.ServletContextEvent;
  5. import javax.servlet.ServletContextListener;
  6. public class ContextListener implements ServletContextListener{
  7. public ContextListener() {
  8. }
  9. private java.util.Timer timer = null;
  10. /**
  11. * 初始化定时器
  12. * web 程序运行时候自动加载
  13. */
  14. @Override
  15. public void contextInitialized(ServletContextEvent arg0) {
  16. /**
  17. * 设置一个定时器
  18. */
  19. timer = new java.util.Timer(true);
  20. arg0.getServletContext().log("定时器已启动");
  21. /**
  22. * 定时器到指定的时间时,执行某个操作(如某个类,或方法)
  23. */
  24. //设置执行时间
  25. Calendar calendar =Calendar.getInstance();
  26. int year = calendar.get(Calendar.YEAR);
  27. int month = calendar.get(Calendar.MONTH);
  28. int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
  29. //定制每天的1:00:00执行,
  30. calendar.set(year, month, day, 01, 00, 00);
  31. Date date = calendar.getTime();
  32. //        System.out.println(date);
  33. int period = 24 * 60 * 60 * 1000;
  34. //每天的date时刻执行task,每隔persion 时间重复执行
  35. timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);
  36. //        在 指定的date时刻执行task, 仅执行一次
  37. //        timer.schedule(new DelFileTask(arg0.getServletContext()), date);
  38. arg0.getServletContext().log("已经添加任务调度表");
  39. }
  40. /**
  41. * 销毁
  42. */
  43. @Override
  44. public void contextDestroyed(ServletContextEvent arg0){
  45. timer.cancel();
  46. arg0.getServletContext().log("定时器销毁");
  47. }
  48. }

这个类 主要是设置一个调度器 并让他 按一定的要求去执行任务。

任务类 监听器类 都实现了 下一步就是在web.xml 配置监听器了

  1. <listener>
  2. <listener-class>com.sxl.ContextListener</listener-class>
  3. </listener>

到了这里   一个简单的定时器基本上实现了 也能跑通了   接下来 需要做的 就是根据自己项目的实际要求 去丰富定时器类 DelFileTask  和启动定时器的ContextListener 。

java.util.Timer 类的 schedule方法说明
 

schedule(TimerTask task, long delay)
安排在指定延迟后执行指定的任务。 (只执行一次)

参数:
task - 所要安排的任务。
delay - 执行任务前的延迟时间,单位是毫秒。
抛出:
IllegalArgumentException - 如果 delay 是负数,或者 delay + System.currentTimeMillis() 是负数。
IllegalStateException - 如果已经安排或取消了任务,或者已经取消计时器。

schedule(TimerTask task, Date time)
安排在指定的时间执行指定的任务。如果此时间已过去,则安排立即执行该任务。 (只执行一次)

参数:
task - 所要安排的任务。
time - 执行任务的时间。
抛出:
IllegalArgumentException - 如果 time.getTime() 是负数。
IllegalStateException - 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。
schedule(TimerTask task,long delay, long period)
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。

在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定Object.wait(long) 所依靠的系统时钟是准确的)。

固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。

参数:
task - 所要安排的任务。
delay - 执行任务前的延迟时间,单位是毫秒。
period - 执行各后续任务之间的时间间隔,单位是毫秒。
抛出:
IllegalArgumentException - 如果delay 是负数,或者 delay + System.currentTimeMillis() 是负数。
IllegalStateException - 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。
schedule(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。

在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。在长期运行中,执行的频率一般要稍慢于指定周期的倒数(假定Object.wait(long) 所依靠的系统时钟是准确的)。

固定延迟执行适用于那些需要“平稳”运行的重复执行活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。

参数:
task - 所要安排的任务。
firstTime - 首次执行任务的时间。
period - 执行各后续任务之间的时间间隔,单位是毫秒。
抛出:
IllegalArgumentException - 如果time.getTime() 是负数。
IllegalStateException - 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。

参考文章 :http://blog.csdn.net/xiaojin21cen/article/details/7725565

java web 项目中 简单定时器实现 Timer的更多相关文章

  1. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  2. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  3. 对Java Web项目中路径的理解

    第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...

  4. Java Web项目中缺少Java EE 6 Libraries怎么添加

    Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...

  5. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  6. java web项目中打开资源文件中文乱码

    1 java web项目中经常使用多模块管理.在某一个模块中添加了一些资源文件.但不是启动项目.有时候需要在程序中读取资源文件内容,打包后放到容器中就不能正常运行了.需要将所有资源文件放到启动项目的 ...

  7. 在java web项目中编写自己的代码生成器

    在java web项目中编写自己的代码生成器

  8. 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面

    一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...

  9. 在Java Web项目中添加定时任务

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...

随机推荐

  1. (1)Java数据结构--图文并茂-分析优缺点

    转:常见Java数据结构&优缺点 - /画家/ - 博客园http://www.cnblogs.com/earl-yongchang/p/5639161.html 图片也是引用过来的,没有重新 ...

  2. jsp映射为其他地址上去 ???

    在web.xml 里面配置servlet不起作用,所以配置jsp,然后在jsp里面跳转到servlet去   ???  第八天中的<08-jsp常用标签.avi> 在web.xml里面先设 ...

  3. CF1102F Elongated Matrix

    题目地址:CF1102F Elongated Matrix 没想到Div.3里还有这么好的题 其实就是求Hamilton路径 预处理 \(d\) 数组: \(d1_{i,j}\) 表示第 \(i,j\ ...

  4. Go语言中的结构体 (struct)

    Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...

  5. 普通函数跟箭头函数中this的指向问题

    箭头函数和普通函数的区别如下. 普通函数:根据调用我的人(谁调用我,我的this就指向谁) 箭头函数:根据所在的环境(我再哪个环境中,this就指向谁) 一针见血式总结: 普通函数中的this: 1. ...

  6. Linux将公网ip映射到局域网ip

    测试环境如下: monitor: msc1:公网IP:103.6.164.128 eth0 内网IP:192.168.0.57 eth0内网IP:192.168.0.16 eth1 通过访问monit ...

  7. html5 - history 历史管理

    参考文章: w3c     :  http://www.w3.org/html/ig/zh/wiki/HTML5/history 张鑫旭  : http://www.zhangxinxu.com/wo ...

  8. websocket:日常总结

    1.报错:DefaultHandshakeHandler : Handshake failed due to invalid Upgrade header 参考文章:https://www.cnblo ...

  9. lanmp安装

    下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)源码编译安装wget http://dl.wdlinux.cn:5180/lanmp_laster.tar.gztar z ...

  10. MinGW-w64非官方编译器集成安装包(很清楚)

    官方链接[编辑] MinGW 官方网站. SourceForge.net上的MinGW官方的下载站点(Win32系统). MinGW-w64官方的下载站点[编辑] MinGW-w64是2005年由On ...