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 ...
随机推荐
- 《SSH网上商城》-视频目录--代码可以跑起来
本课程是2015年2月份的,就是14年底的. 课程第一天的代码-添加 jsp-api.jar servlet-api.jar就可以跑起来,环境 JDK1.7 和tomcat8, SSH网上商城\S ...
- Django学习手册 - ORM 单表数据获取
Django 单表数据的获取: 先建立数据表格 from django.db import models # Create your models here. class userinfo(model ...
- 如何访问IPV6?很简单,几个命令行即可。
参考:清华大学ISATAP隧道配置方法 简单介绍一下windows下的配置方法,其他系统的配置方法详见上面提供的个链接. 首先打卡管理员权限的命令行窗口,依次输入如下命令即可 netsh int ip ...
- CF1105E Helping Hiasat
题目地址:CF1105E Helping Hiasat 首先将问题转化成图论:对每个人建立一个点,将同一次修改后的所有人代表的点两两连一条边,那么最终所求的就是这个图的最大独立集 我们知道最大独立集是 ...
- Python换行符问题:\r\n还是\n?
今天写一个Python脚本去读取一个txt文件时,发现一个很有趣的现象: 如果这个文件是用atom编辑器写的,发现换行符是'\r'.这样一来去逐行读取数据就失效了,因为用open函数 去打开该文件re ...
- Focal Loss
为了有效地同时解决样本类别不均衡和苦难样本的问题,何凯明和RGB以二分类交叉熵为例提出了一种新的Loss----Focal loss 原始的二分类交叉熵形式如下: Focal Loss形式如下: 上式 ...
- web服务器上某一中文名文件无法访问
只需要在此目录下 convmv -f GBK -t UTF-8 --notest *.xxx 执行这个命令即可
- Boost property_tree解析json
使用Boost property_tree解析json 之前使用jsoncpp解析json,现在才知道boost就有解析的库,学习一下吧 property_tree可以解析xml,json,ini,i ...
- centos如何安装Python3
Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...
- thyemleaf:禁用JS缓存(原创)
在开发时经常需要调整JS,但是调整后由于页面缓存的原因,看不到实时效果. 开发环境:springboot+thymeleaf 1.配置文件多模式 2.获得当前的激活的模式和随机数 import org ...