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

版权声明:本文为博主原创文章,未经博主允许不得转载。
java web 项目中 简单定时器实现 Timer
项目背景: 系统中有一个存放压缩文件的临时文件夹。当时间长了后 存放文件多了,占用磁盘空间过大 让费资源, 所以需要定期去清理临时文件夹下的文件。所以最先想到了使用定时器来实现该功能。
调查: 通过查阅资料 了解到使用java实现这个功能 有三种方法
1》使用Quartz 框架 这是一个开源的任务调度框架
2》 使用 ScheduledExecutor 实现
3》 使用 timer 实现
因为我这只是要实现一个简单定时清理临时文件夹的任务 不需要太多复杂的东西。 所以 我选择了第三种方案 自己使用jdk 自带的 timer 类来实现。
任务类 主要的业务代码
- package com.sxl;
- import java.util.TimerTask;
- import javax.servlet.ServletContext;
- /**
- * 定时器
- * @author sxl
- *
- */
- public class DelFileTask extends TimerTask{
- private static boolean isRunning = false;
- private ServletContext context = null;
- public DelFileTask() {
- super();
- }
- public DelFileTask(ServletContext context) {
- this.context = context;
- }
- @Override
- public void run() {
- if (!isRunning) {
- context.log("开始执行指定任务");
- /**
- * 自己的业务代码
- */
- isRunning = false;
- context.log("指定任务执行结束");
- } else {
- context.log("上一次任务执行还未结束");
- }
- }
- }
这个类 主要是继承 TimerTask并实现它的run 方法
下面就是监听类了 监听服务器的启动并将任务添加到任务栈
- package com.sxl;
- import java.util.Calendar;
- import java.util.Date;
- import javax.servlet.ServletContextEvent;
- import javax.servlet.ServletContextListener;
- public class ContextListener implements ServletContextListener{
- public ContextListener() {
- }
- private java.util.Timer timer = null;
- /**
- * 初始化定时器
- * web 程序运行时候自动加载
- */
- @Override
- public void contextInitialized(ServletContextEvent arg0) {
- /**
- * 设置一个定时器
- */
- timer = new java.util.Timer(true);
- arg0.getServletContext().log("定时器已启动");
- /**
- * 定时器到指定的时间时,执行某个操作(如某个类,或方法)
- */
- //设置执行时间
- Calendar calendar =Calendar.getInstance();
- int year = calendar.get(Calendar.YEAR);
- int month = calendar.get(Calendar.MONTH);
- int day =calendar.get(Calendar.DAY_OF_MONTH);//每天
- //定制每天的1:00:00执行,
- calendar.set(year, month, day, 01, 00, 00);
- Date date = calendar.getTime();
- // System.out.println(date);
- int period = 24 * 60 * 60 * 1000;
- //每天的date时刻执行task,每隔persion 时间重复执行
- timer.schedule(new DelFileTask(arg0.getServletContext()), date, period);
- // 在 指定的date时刻执行task, 仅执行一次
- // timer.schedule(new DelFileTask(arg0.getServletContext()), date);
- arg0.getServletContext().log("已经添加任务调度表");
- }
- /**
- * 销毁
- */
- @Override
- public void contextDestroyed(ServletContextEvent arg0){
- timer.cancel();
- arg0.getServletContext().log("定时器销毁");
- }
- }
这个类 主要是设置一个调度器 并让他 按一定的要求去执行任务。
任务类 监听器类 都实现了 下一步就是在web.xml 配置监听器了
- <listener>
- <listener-class>com.sxl.ContextListener</listener-class>
- </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的更多相关文章
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
- linux 下用renameTo方法修改java web项目中文件夹名称问题
经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...
- 对Java Web项目中路径的理解
第一个:文件分隔符 坑比Window.window分隔符 用\;unix采用/.于是用File.separator来跨平台 请注意:这是文件路径.在File f = new File(“c:\\hah ...
- Java Web项目中缺少Java EE 6 Libraries怎么添加
Java Web项目中缺少Java EE 6 Libraries怎么添加 具体步骤如下: 1.项目名称上点击鼠标右键,选择"Build Path-->Configure Build P ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- java web项目中打开资源文件中文乱码
1 java web项目中经常使用多模块管理.在某一个模块中添加了一些资源文件.但不是启动项目.有时候需要在程序中读取资源文件内容,打包后放到容器中就不能正常运行了.需要将所有资源文件放到启动项目的 ...
- 在java web项目中编写自己的代码生成器
在java web项目中编写自己的代码生成器
- 在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面
一背景 公司安全整改, 要求:系统中对于关键业务操作应确保使用浏览器"后退"功能无法回到上一步操作界面. 提供:凭证提供所有被检查系统关键业务操作后回退视频,视频显示关键业务操作后 ...
- 在Java Web项目中添加定时任务
在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: impor ...
随机推荐
- keepalived高可用系列~keepalived+mysql
一 简介:建立读写分离模式 二 keepalived相关配置 vrrp_instance VI_1 { state MASTER // 可修改 interface eth0 virtual_r ...
- HTML - HTML基础篇
一.什么是html ? 超文本标记语言.HTML 是标记语言 历史版本: Html 4.01 1999年12月24日,w3c推荐标准 (老网站) 如今 是 html 5 版本. 1.Html 标签拥有 ...
- Django实战(一)-----用户登录与注册系统4(表单)
我们前面都是手工在HTML文件中编写表单form元素,然后在views.py的视图函数中接收表单中的用户数据,再编写验证代码进行验证,最后使用ORM进行数据库的增删改查.这样费时费力,整个过程比较复杂 ...
- 20145215《网络对抗》Exp4 恶意代码分析
20145215<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
- while(cin>>n1>>n2)
这里有2个点, 1. while(cin>>n)用到了强制类型转换 2. 强调输入遇到-1则退出,说明要一直看是否输入了-1,并记录下来 #include <iostream> ...
- HTTP协议06-报文首部
HTTP报文格式 HTTP协议的请求和响应报文中必定包含HTTP首部.首部内容为客户端和服务器分别处理请求和响应提供所需要的信息. 1)HTTP请求报文 在请求中,HTTP报文由方法.URI.HT ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总(转)
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...
- 【转】C++对成员访问运算符->的重载
运算符->的重载比较特别,它只能是非静态的成员函数形式,而且没有参数. 1.如果返回值是一个原始指针,那么就将运算符的右操作数当作这个原始指针所指向类型的成员进行访问: 2.如果返回值是另一个类 ...
- git与eclipse集成之更新特性分支代码到个人特性分支
1.1. 更新特性分支代码到个人特性分支 在基于特性分支开发的过程中,存在多人向特性分支提交代码的情况,开发者需要关注特性分支代码与个人分支代码保持同步,否则可能导致提交代码冲突. 具体代码同步步骤: ...
- VS2013中如何解决error C4996: 'fopen'问题
今天编写控制台应用程序时出现如下错误 error C4996: 'fopen': This function or variable may be unsafe. Consider using fop ...