1、创建一个监听 实现 ServletContextListener类
public class TimeTaskListener implements ServletContextListener{
private DayReportATask dayReportATask = new DayReportATask();
/**
* 本方法的描述:
* 在所有的filter和servlet都destroyed后通知web应用的所有的ServletContextListeners[that“本店”即将打烊啦]
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("contextDestroyed…………");
dayReportATask.taskEnd();
}
/**
* 这个方法的描述:
* 在所有的filter和servlet初始化之前,所有的ServletContextListeners会收到[您所在的web应用的初始化工作开始啦]通知
*/
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("contextInitialized……");
dayReportATask.taskBegin();
}
}
2、创建一个类执行定时任务 此处使用的是在特点时间点进行定时任务的启动,并周期为1天
public class DayReportATask {
// newScheduledThreadPool(int corePoolSize),corePoolSize是线程池的大小,
//即保持活动或者闲置的线程,它们是任务调度时用于并发执行的线程
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> taskHandle;
/**
* 启动任务
*/
public void taskBegin() {
// 定义一个任务
final Runnable task = new Runnable() {
public void run() {
System.out.println("执行任务");
}
};
// scheduleAtFixedRate(Runnable command, long initialDelay, long period,
// TimeUnit unit):
// 通过ScheduledExecutorService的scheduleAtFixedRate来执行任务
// 参数
// command - 要执行的任务
// initialDelay - 首次执行的延迟时间
// period - 连续执行之间的周期
// unit - initialDelay 和 period 参数的时间单位
System.out.println("任务启动………………………………");
long oneDay = 24 * 60 * 60 * 1000;
long initDelay = getTimeMillis("03:00:00") - System.currentTimeMillis();
initDelay = initDelay > 0 ? initDelay : oneDay + initDelay;
taskHandle = scheduler.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
// taskHandle = scheduler.scheduleAtFixedRate(task, initDelay, oneDay, TimeUnit.MILLISECONDS);
}
/**
* 结束任务
*/
public void taskEnd() {
scheduler.shutdown(); //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
// List<Runnable> shutdownNow()试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
}
/**
* 获取指定时间对应的毫秒数
* @param time "HH:mm:ss"
* @return
*/
private static long getTimeMillis(String time) {
try {
DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
DateFormat dayFormat = new SimpleDateFormat("yy-MM-dd");
Date curDate = dateFormat.parse(dayFormat.format(new Date()) + " " + time);
return curDate.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
}
3、在web.xml中配置监听
<listener>
<listener-class>listeners.TimeTaskListener</listener-class>
</listener>