在Resin中做传统计划任务到Web形式的转换是件特简单的事情,因为Resin的配置文件支持Run-at标签,可以象crontab那样,定时地、周期地去调用指定的Servlet。
而在Tomcat中事情变得稍微复杂了一点点。现在假设我们需要一个每隔一个星期自动清除旧数据的程序,整个程序可以划分为3部分:
ContextListener.java: javax.servlet.ServletContextListener的实现;
CleanDataTask.java: java.util.TimerTask的实现;
CleanData.java: 具体业务逻辑(数据清除行为)的实现;
ContextListener.java
package com.hosine.tschedule;
import javax.servlet.*;
public class ContextListener implements javax.servlet.ServletContextListener {
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log("timer is running...");
timer.schedule(new CleanDataTask(event.getServletContext()), 0,
60 * 60 * 1000 * 24 * 7);
event.getServletContext().log("task has been added...");
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("destroy timer...");
}
}
CleanDataTask.java
package com.hosine.tschedule;
import java.util.TimerTask;
public class CleanDataTask extends TimerTask {
String webappRoot = "";
public CleanDataTask(javax.servlet.ServletContext context){
webappRoot = context.getRealPath("/");
}
public void run() {
CleanData.setWebappRoot(webappRoot);
CleanData.cleanFileData();
CleanData.cleanDbSourceData();
}
}
CleanData.java
package com.hosine.tschedule;
public class CleanData {
private static String webappRoot = "";
protected static void setWebappRoot(String webappRootPath){
webappRoot = webappRootPath;
}
protected static void cleanFileData(){
System.out.println("clean file data");
}
protected static void cleanDbSourceData(){
System.out.println("clean db data");
}
}
最后一步就是在Web Application的web.xml配置文件添加ContextListener的配置信息:
<!-- clean old data every week -->
<listener>
<listener-class>com.hosine.tschedule.ContextListener</listener-class>
</listener>