写了一个Timer的工具类,比较通用,用于定时执行某个任务,时间可以自定义配置
package com.shutao.test.schedule;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TimerUtil {
//默认时间间隔一天
private static long PERIOD_TIME = 24 * 60 * 60 * 1000;
Log log = LogFactory.getLog(TimerUtil.class);
/**
* 执行定时任务
* @param myTask 要执行的任务
* @param dayInterval 每隔多少天执行一次任务
* @param hour 每隔多少天在几点执行任务
* @param minute 每隔多少天在几点几分执行任务
* @author linshutao
* */
public void startMyTask(TimerTask myTask,int dayInterval,int hour,int minute){
PERIOD_TIME = dayInterval * 24 * 60 * 60 * 1000;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
//执行定时任务的时间
Date date=calendar.getTime();
//为了避免若容器启动的时间晚于定时时间,在重启容器的时候会立刻执行任务,这里进行处理
if (date.before(new Date())) {
date = this.addDay(date, 1);
}
Timer timer = new Timer();
//任务在指定的时间开始进行重复的固定延迟执行
timer.schedule(myTask,date);
}
public Date addDay(Date date, int num) {
Calendar startDT = Calendar.getInstance();
startDT.setTime(date);
startDT.add(Calendar.DAY_OF_MONTH, num);
return startDT.getTime();
}
}
接下来写一个listener,在容器启动的时候触发定时事件:
public class StartupListener extends ContextLoaderListener
implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
String day = AppConfig.getProperty(AppConfig.REBUILDINDEX_DAY);//获取配置文件中对定时任务的时间配置,若没配置则为每天凌晨1点分执行
String hour = AppConfig.getProperty(AppConfig.REBUILDINDEX_HOUR);
String minute = AppConfig.getProperty(AppConfig.REBUILDINDEX_MINUTE);
//定时重建索引
day=day==null?"1":day;
hour=hour==null?"1":hour;
minute=minute==null?"0":minute;
new TimerUtil().startMyTask(new RebuildIndexTask(),
Integer.parseInt(day), Integer.parseInt(hour), Integer.parseInt(minute));
}
public void contextDestroyed(ServletContextEvent event) {
}
web.xml中这样配置:
<listener>
<listener-class>
com.shutao.test.StartupListener
</listener-class>
</listener>