定时执行

定时执行
定时执行

定时执行任务的三种方法:

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:

com.sysnet.demo.util.MyTimerTask

3)org.springframework.scheduling.timer.ScheduledTimerTask

如果你用spring,那么你不需要写Timer类了,在schedulingContext-timer .xml中加入下面的内容就可以了:

10000

86400000

下面给出方法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里加入一下代码:

com.sysnet.demo.util.MyTimerTask

例子二:

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中添加如下代码:

https://www.360docs.net/doc/b718998801.html,c.servletListener.StatisticsContextListener

相关主题
相关文档
最新文档