您的位置:首页 > 编程语言 > Java开发

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

2017-09-20 15:24 726 查看
实现一个定时清理临时文件夹的任务 Timer

这个类最终功能是每天某个时间点(如每晚22点)执行某一功能。

首先,介绍Java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util.
TimerTask)


如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000)。

    schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,

第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒。

由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

任务类  主要的业务代码

[java] view
plain copy

 print?

import java.util.TimerTask;    

    

import javax.servlet.ServletContext;    

    

/**  

 * 定时器   

 * @author sxl  

 *  

 */    

public 
1ba1f
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 方法

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

[java] view
plain copy

 print?

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 配置监听器了 

[plain] view
plain copy

 print?

<listener>    

        <listener-class>com.sxl.ContextListener</listener-class>      

</listener>   

到了这里   一个简单的定时器基本上实现了 也能跑通了   接下来 需要做的 就是根据自己项目的实际要求 去丰富定时器类 DelFileTask  和启动定时器的ContextListener 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java web 定时器