写一个定时任务类,继承java.tuil.TimerTask,重写run()方法,在该方法中实现任务业务代码。

package com.gao.timertask;

import java.util.TimerTask;

public class MyTimerTask extends TimerTask {

    public MyTimerTask() {}
    
    @Override
    public void run() {
        //定时任务业务逻辑代码
    }

}

写一个定时器管理类,start()方法来启动定时器,定制任务执行的时间间隔,并加入定时任务。

package com.gao.timertask;

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

public class TimerManager {
    /**
     * 执行任务的间隔
     */
    private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;

    private int hour = 2;
    private int minute = 0;
    private int second = 0;
    private MyTimerTask timerTask;
   
    public TimerManager() {}

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        this.minute = minute;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }
    
    public MyTimerTask getTimerTask() {
        return timerTask;
    }
    
    public void setTimerTask(MyTimerTask timerTask) {
        this.timerTask = timerTask;
    }

    // 增加或减少天数
    public Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();
    }
    
    /**
     * 启动定时器
     */
    public void start()  {
        Calendar calendar = Calendar.getInstance();

        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);

        Date date=calendar.getTime(); //第一次执行定时任务的时间

        //如果第一次执行定时任务的时间 小于 当前的时间
        //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
        if (date.before(new Date())) {
            date = this.addDay(date, 1);
        }
        Timer timer = new Timer();

        //安排指定的任务在指定的时间开始进行重复的固定延迟执行。
        timer.schedule(timerTask, date,PERIOD_DAY);
    }
}


利用监听器启动定时器。

package com.gao.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.gao.timertask.TimerManager;

public class MyTimerTaskListener implements ServletContextListener {
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        WebApplicationContext context = WebApplicationContextUtils.
                getRequiredWebApplicationContext(sce.getServletContext()); 
        TimerManager timerManager = (TimerManager) context.getBean("timerManager"); 
        timerManager.start();//启动定时器管理器
    }

}