现在的位置: 首页 > 综合 > 正文

java的Timer,定时执行某个任务

2013年02月13日 ⁄ 综合 ⁄ 共 1905字 ⁄ 字号 评论关闭
写了一个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>

抱歉!评论已关闭.