定时器

监听器

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

/**
 * 监听类:监听服务器的启动并将任务添加到任务栈
 */

@WebListener
public class ContextListener implements ServletContextListener{

    public ContextListener() {
    }

    private java.util.Timer timer = null;

    /**
     * 初始化定时器
     * web 程序运行时候自动加载
     */
    @Override
    public void contextInitialized(ServletContextEvent arg0) {

        /**
         * 设置一个定时器
         */
        timer = new 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, 17, 16, 00);
        Date date = calendar.getTime();
//        System.out.println(date);

        int period = 24 * 60 * 60 * 1000;
        //每天的date时刻执行task,每隔persion 时间重复执行
        timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date, period);
//        在 指定的date时刻执行task, 仅执行一次
//        timer.schedule(new AutoReceiptJob(arg0.getServletContext()), date);
        arg0.getServletContext().log("已经添加任务调度表");

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

任务

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

/**
 * 定时器任务类:主要是继承 TimerTask并实现它的run 方法 
 */
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("上一次任务执行还未结束");
        }
    }

}

 

posted @ 2019-06-20 14:11  白夜梦鱼  阅读(180)  评论(0编辑  收藏  举报