定时执行
定时执行任务的三种方法:
1)java.util.Timer.
2)ServletContextListener.
3)org.springframework.scheduling.timer.ScheduledTimerTask
1)java.util.Timer
这个方法应该是最常用的,不过这个方法需要手工启动你的任务:
Timer timer=new Timer();
timer.schedule(new ListByDayTimerTask(),10000,86400000);
这里的ListByDayTimerTask类必须extends TimerTask里面的run()方法。2)ServletContextListener
这个方法在web容器环境比较方便,这样,在web server启动后就可以
自动运行该任务,不需要手工操作。
将ListByDayListener implements ServletContextListener接口,在contextInitialized方法中加入启动Timer的代码,在contextDestroyed
方法中加入cancel该Timer的代码;然后在web.xml中,加入listener:
3)org.springframework.scheduling.timer.ScheduledTimerTask
如果你用spring,那么你不需要写Timer类了,在schedulingContext-timer .xml中加入下面的内容就可以了:
下面给出方法2的一个例子供大家参考:
Java代码:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyTimerTask implements ServletContextListener{ private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub
timer.cancel();
event.getServletContext().log("定时器销毁");
System.out.println("停止备份程序……");
}
@Override
public void contextInitialized(ServletContextEvent event) {
//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
timer = new Timer(true);
event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到
timer.schedule(new
exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
}
}
import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class exportHistoryBean extends TimerTask
{
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public exportHistoryBean(ServletContext context)
{
this.context = context;
}
@Override
public void run()
{
Calendar c = Calendar.getInstance();
if(!isRunning)
{
if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定任务");
isRunning = false;
context.log("指定任务执行结束");
}
else
{
context.log("上一次任务执行还未结束");
}
}
}
}
web.xml里加入一下代码:
例子二:
package https://www.360docs.net/doc/b718998801.html,c.servletListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import https://www.360docs.net/doc/b718998801.html,c.city.StatisticsTask;
/**
* 统计ContextListener
* @author westd
*
*/
/**
* @author westd
*
*/
public class StatisticsContextListener implements ServletContextListener
{
private java.util.Timer timer = null;
/**
* 这个方法在Web应用服务做好接受请求的时候被调用。
*
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) */
public void contextInitialized(ServletContextEvent event)
{
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
timer.schedule(new StatisticsTask(event.getServletContext()), 0, 60*60*1000);//每隔1小时
event.getServletContext().log("已经添加任务调度表");
}
/**
* 这个方法在Web应用服务被移除,没有能力再接受请求的时候被调用。
*
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) */
public void contextDestroyed(ServletContextEvent event)
{
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}
package https://www.360docs.net/doc/b718998801.html,c.city;
import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
/**
* 统计任务
* @author westd
*
*/
public class StatisticsTask extends TimerTask
{
private static final int STATISTICS_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public StatisticsTask(ServletContext context)
{
this.context = context;
}
@Override
public void run()
{
Calendar cal = Calendar.getInstance();
//System.out.println(isRunning);
if (!isRunning)
{
if (STATISTICS_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) //查看是否为凌晨
{
isRunning = true;
context.log("开始执行指定任务");
//TODO 添加自定义的详细任务
executeTask();
//指定任务执行结束
isRunning = false;
context.log("指定任务执行结束");
}
}
else
{
context.log("上一次任务执行还未结束");
}
}
/**
* 执行任务
*/
public void executeTask()
{
System.out.println("任务1");
System.out.println("任务2");
}
}
web.xml中添加如下代码: