您可以使用 ServletContextListener
在 webapp 的启动时执行一些初始化。运行定期任务的标准Java API方法是Timer
和TimerTask
的组合。下面是一个启动示例:
public void contextInitialized(ServletContextEvent event) {
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new CleanDBTask(), 0, oneHourInMillis);
timer.scheduleAtFixedRate(new StatisticsTask(), 0, oneQuartInMillis);
}
其中,这两个任务可能如下所示:
public class CleanDBTask extends TimerTask {
public void run() {
// Implement.
}
}
但是,不建议在 Java EE 中使用。如果任务引发异常,则整个线程将被终止,您基本上需要重新启动整个服务器才能使其再次运行。对系统时钟的变化也很敏感。Timer
Timer
Timer
更新,更健壮的java.util.concurrent
方式将是RespectedExecutorService
和Runnable
的组合。下面是一个启动示例:
private ScheduledExecutorService scheduler;
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new CleanDBTask(), 0, 1, TimeUnit.HOURS);
scheduler.scheduleAtFixedRate(new StatisticsTask(), 0, 15, TimeUnit.MINUTES);
}
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}