Home > 我就是未分类 > 在web项目中实现计划任务

在web项目中实现计划任务

September 15th, 2005

java.util.Timer和java.util.TimerTask可以很好的实现计划任务

timer = new java.util.Timer(true);
timer.schedule(new myTask(), 0, 50000);

以上语句实现每50(50000毫秒)秒执行一次myTask(); myTask 继承TimerTask类。

另外还要求随着web项目的生命周期运行,web项目启动时此任务的定时器启动,web项目停止时任务的定时器也停止,所以必须实现
javax.servlet.ServletContextListener
接口。接口有两个有两个方法
contextInitialized(ServletContextEvent event)
contextDestroyed(ServletContextEvent event)
把任务定时器的启动和结束分别放到两个方法的实现中。代码如下:
——————————————————————————
package dowei.task;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.*;

public class ContextListener implements ServletContextListener {

private java.util.Timer timer = null;

public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log(“启动定时器”);
//定时执行任务
timer.schedule(new myTask(event.getServletContext()), 0, 50000);
}

public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log(“停止定时器”);
}
}
—————————————————————————

这样就实现了定时器随web项目的启动和停止。然后写具体的任务方法:myTask类。
myTask类继承java.util.TimerTask。我在上面调用时为了方便记录执行状态,在构造myTask时传入了参数ServletContextEvent event,所以必须重载构造函数。
为了防止一次运行还为结束下一次调度有开始了,所以设置一个变量isRunning
doTask()方法中写具体的操作
——————————————————————————
package dowei.task;

import java.util.TimerTask;
import javax.servlet.ServletContext;

public class myTask extends TimerTask {
private static boolean isRunning = false;

public myTask(ServletContext context) {
this.context = context;
}
public void run() {
if (!isRunning)  {
isRunning = true;
context.log(“开始执行任务”);
createFile();
isRunning = false;
context.log(“任务执行结束”);
}
}else
{
context.log(“上次任务还未结束”);
}
}

private void doTask(){
//需要执行的动作
}
}
————————————————————————-

最后要把作为监听类部署。修改web.xlm,在添加<web-app></web-app> 标签中间添加<listener>标签,代码如下(红色部分换成适当的包名):
————————————————————————-
<listener>
<listener-class>dowei.task.ContextListener</listener-class>
</listener>
—————————————————————–

我就是未分类

  1. No comments yet.
  1. No trackbacks yet.