写了一个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>