在 web 应用中 设计定时执行的任务;
方法一:
使用Servlet上下文有关的侦听器
步骤:
(一)
创建一个Listener 类 实现接口:ServletContextListener
实现接口的两个方法:
package com.bjmobile.action;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 侦听器类 和Timer 结合起来 完成侦听定时执行任务;
* @author new
*
*/
public class ContextListener implements ServletContextListener {
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);// true表明定义为守护线程;
System.out.println("定时器已启动");
// 定时器调度语句,其中MyTask是自定义需要被调度的执行任务
// 初始化时就 执行一次任务;
//此例为每隔三分钟执行一次任务;
timer.schedule(new MyTask(), 0, 3 * 60 * 1000);
System.out.println("已经添加任务调度表");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
System.out.println("定时器销毁");
}
}
(二)
创建一个任务类MyTask:继承TimerTask类
把任务写在run方法中:
package com.bjmobile.action;
import java.util.Calendar;
import java.util.TimerTask;
// 定时执行的任务类
public class MyTask extends TimerTask {
private static final int C_SCHEDULE_HOUR = 11;
private static boolean isRunning = false;
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
//时间为11点时才执行任务,否则不执行;
//所以调度器timer.schedule的间隔时间不能大于一小时,否则可能错过时间段;
//调度器timer.schedule的间隔时间也不能小于一小时,否则可能一天执行几次任务;
isRunning = true;
System.out.println("开始执行指定任务");
// TODO 添加自定义的详细任务,以下只是示例
int i = 0;
while (i++ < 5) {
System.out.println("已完成任务的" + i + "/" + 10);
}
//end
isRunning = false;
System.out.println("指定任务执行结束");
} else {
System.out.println("还不到任务执行的时间");
}
} else {
System.out.println("上一次任务执行还未结束");
}
}
}
(三)
在 web.xml文件中配置 Listener 类:
方法二:
使用一个专门的servlet,把任务调度器初始化放在servlet的init方法中,设置web服务器自动加载此servlet
步骤:
(一)
创建一个TaskServlet 类
package com.bjmobile;
import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
/**
* servlet 和Timer 结合起来 完成侦听定时执行任务,在初始化时加载调度器;
* @author new
*
*/
public class TaskServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
Timer timer = new Timer();
public void init() throws ServletException {
String sendmailhour = "14";
String sendmailminutes = "04";
String sendmailsecond = "30";
// 设置首次执行时间;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sendmailhour));
cal.set(Calendar.MINUTE, Integer.parseInt(sendmailminutes));
cal.set(Calendar.SECOND, Integer.parseInt(sendmailsecond));
System.out.println("******* 1. current time:"+cal.getTime());
// 由于timer初始化时,如果定时器定的当天的时间已经过去了马上执行一次任务,
// 如果当天的时间还不到,则等时间到了 再执行任务;
// 定时器调度语句,其中TestTask是自定义需要被调度的执行任务
// cal.getTime()为首次执行时间;
// 此例以后过24小时执行一次任务;
timer.schedule(new TestTask(), cal.getTime(), 24 * 60 * 60 * 1000);
System.out.println("定时器2已启动");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
timer.cancel(); //要主动销毁;否则关闭项目应用时,定时器没被销毁
System.out.println("定时器2销毁!");
}
}
(二)
创建一个任务类TestTask:继承TimerTask类
把任务写在run方法中:
package com.bjmobile;
import java.util.TimerTask;
// 定时执行的任务类
public class TestTask extends TimerTask {
public void run() {
System.out.println("执行任务");
}
}
(三)
在 web.xml文件中配置 servlet 类:
// 这个servlet是执行后台操作,不需要相应外部请求,因此没有必要为它定义servlet-mapping。
//