标签: 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. Flask与mysql数据库字段类型的区别以及基本用法

    Mysql里面的int在Flask中里面使用Integer Mysql里面的varcahar在Flask中里面使用String 与Mysql数据库需要导入模块 #导入第三方链接库sql点金术 from ...

  2. Struts2-052 漏洞复现

    s2-052漏洞复现 参考链接: http://www.freebuf.com/vuls/147017.html http://www.freebuf.com/vuls/146718.html 漏洞描 ...

  3. DeepLearning.ai-Week4-Deep Learning & Art: Neural Style Transfer

    1 - Task Implement the neural style transfer algorithm Generate novel artistic images using your alg ...

  4. Css - 精灵图

    Css - 精灵图css sprite 一个页面文档上总是会有N多的图标小图片,它们都是以背景图的方式嵌入文档,每个小图片需要一个url的css属性,每个url都指向一个服务器地址的链接,每个链接都代 ...

  5. openstack Q版部署-----网络服务(neutron)安装部署(7)

    一.数据库配置(控制节点) 控制节点创建数据库: CREATE DATABASE neutron; GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'lo ...

  6. 【php】下载站系统Simple Down v5.5.1 xss跨站漏洞分析

    author:zzzhhh 一.        跨站漏洞 利用方法1,直接在搜索框处搜索<script>alert(/xss/)</script>//',再次刷新,跨站语句将被 ...

  7. CDHtmlDialog探索----Javascript与窗体交互

    CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了.归根结底交互的基理就是实现相 ...

  8. ubuntu 安装 wireshark

    1.添加 wireshark 源 sudo apt-add-repository ppa:wireshark-dev/stable 2.更新    sudo apt-get update 3.安装 w ...

  9. android studio定时器

    1.超时 CountDownTimer第一个参数超时时间,第二个参数多久执行一次onTick(), 到达设定的超时时间执行onFinsh(),cancel取消超时计数,start重新开始(从零开始). ...

  10. Unix下5种I/O模型

    Unix下I/O模型主要分为5种: (1)阻塞式I/O (2)非阻塞式I/O (3)I/O复用(select和poll) (4)信号驱动式I/O (5)异步I/O 1.阻塞式I/O模型 unix基本的 ...