Java Web项目中定时器Timer的使用

在以前的文章中,曾经写过一个调度器Quartz的使用实例,今天,分享一个JDK自带的定时器Timer在Java Web项目中的使用。

首先,简单说一下Quartz和Timer的相同和不同之处:

相同:他们都是定时去执行一些操作,比如,定时删除一些过期数据,定时发送一些通知消息等等。
区别:Quartz是一个开源的任务调度框架,需要进行配置和加入相应的依赖,而Timer是JDK自带的一个定时器,无需配置。

总结: 因为Quartz是一个开源的任务调度框架,所以功能更为强大和全面,但是使用较为繁琐,而Timer功能较Quartz来说简单一点,所以,复杂的任务调度最好使用Quartz,简单的任务调度使用Timer。

1、使用Timer首先要写一个任务类,代码如下:

package com.siweisoft.timer;

import javax.servlet.ServletContext;
import java.util.TimerTask;

/**
 * 定时器任务类:主要是继承 TimerTask并实现它的run 方法
 * Created by Robin on 2017-08-03.
 */
public class AutoReceiptJob extends TimerTask{

    private static boolean isRunning = false;

    private ServletContext context = null;

    public AutoReceiptJob() {
        super();
    }

    public AutoReceiptJob(ServletContext context) {
        this.context = context;
    }
    int count = 1;
    @Override
    public void run() {
        if (!isRunning) {
            context.log("开始执行指定任务");

            /**
             * 自己的业务代码
             */
            System.out.println("定时器运行了"+count+"次");
            count++;

            isRunning = false;
            context.log("指定任务执行结束");
        } else {
            context.log("上一次任务执行还未结束");
        }
    }

}

2、因为这是web项目,需要写一个监听器来监听容器的启动与销毁,代码如下:

package com.siweisoft.timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Calendar;
import java.util.Date;

/**
 * 监听类:监听服务器的启动并将任务添加到任务栈
 * Created by Robin on 2017-08-03.
 */
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 AutoReceiptJob(arg0.getServletContext()), 2000L, 1000L);
//        在 指定的date时刻执行task, 仅执行一次
//        timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date);
        arg0.getServletContext().log("已经添加任务调度表");

    }
    /**
     * 当服务器停止时,定时器销毁
     */
    @Override
    public void contextDestroyed(ServletContextEvent arg0){
        timer.cancel();
        arg0.getServletContext().log("定时器销毁");
    }
}

3、在web.xml配置一下监听器,代码如下:

 <listener>  
        <listener-class>com.sxl.ContextListenerlistener-class>    
listener> 

当服务器启动是,任务类会按照设定好的时间或时间间隔去执行。

你可能感兴趣的:(Java Web项目中定时器Timer的使用)