import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class HandleTimerTask implements ServletContextListener {
private Timer timer = null; //定时器
private static int DOWNlOAD_HOUR = 0; //执行任务开始时间(时)
private static int DOWNlOAD_MINUTE = 0; //执行任务开始时间(分)
private static int DOWNlOAD_SECOND = 0; //执行任务开始时间(秒)
private long delay; //延时时间值(当前系统时间到下载时间之间的时间差毫秒数)
public void contextInitialized(ServletContextEvent event) {
init();//初始化参数
timer = new Timer(true);//创建Timer对象
//定时执行程序
timer.schedule(new Handle(event.getServletContext()),delay,24*60*60*1000);//调用Handle()类(即每天要执行的任务),delay表示延迟毫秒数,0,24*60*60*1000表示每隔一天执行一次任务,60*60*1000表示一个小时;
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
}
/**
* 初始化参数
* @return
*/
public void init(){
//声明一个Calendar对象
Calendar cal = Calendar.getInstance();
//设置时间
cal.set(Calendar.HOUR_OF_DAY, DOWNlOAD_HOUR);
cal.set(Calendar.MINUTE, DOWNlOAD_MINUTE);
cal.set(Calendar.SECOND, DOWNlOAD_SECOND);
Date date = new Date();
//获取设定的时间
date = cal.getTime();
//声明当前时间
Date now = new Date();
//获取设定的时间和当前的时间差(毫秒数)
long interval = date.getTime() - now.getTime();
//如果当前时间大于下载时间,则将下载时间设置为下一个下载时间
if (interval < 0) {
cal.add(Calendar.DAY_OF_MONTH, 1);//将天数加1
date = cal.getTime();
//获取设定的时间和当前的时间差(毫秒数)
interval = date.getTime() - now.getTime();
}
this.startTime = date;//初始化开始下载时间
this.delay = interval;//初始化当前时间到下载时间之间的时间差
}
}
public class Handle extends TimerTask {
private ServletContext context = null;
Timer timer = null; //查询任务定时器
public Handle(ServletContext context)
{
this.context = context;
}
/**
* 开始执行
*/
public void run() {
//开始执行
context.log("开始执行!");
}
}
用延迟时间可以实现,添加了一个init()方法用来计算延时数,不管什么时候启动服务,都可以根据当前系统时间和执行任务的开始时间计算出延时时间毫秒数。