在服务器端为servlet JSP MVC网站运行定期任务

时间:2010-02-12 01:03:02

标签: java servlets scheduled-tasks

我使用servlet和JSP开发了一个Web应用程序。我本身并没有使用任何框架,而是使用我自己的自制MVC框架。我使用MySQL作为后端。

我想做以下事情:

  1. 每小时从数据库中清理一些数据
  2. 在某处的XML文件中每15分钟生成并存储有关数据的统计信息
  3. 问题是:目前我的所有代码都是从客户端收到的请求运行的。

    如何在服务器端运行定期任务?

    我现在的一个解决方案是在控制器的init函数中创建一个线程。还有其他选择吗?

2 个答案:

答案 0 :(得分:41)

您可以使用ServletContextListener在webapp的启动时执行一些初始化。运行定期任务的标准Java API方式是TimerTimerTask的组合。这是一个启动示例:

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方式将是ScheduledExecutorServiceRunnable的组合。这是一个启动示例:

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();
}

答案 1 :(得分:2)

您可以使用任何调度程序来安排您的过程,例如quartz,spring scheduler

http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html对任何实现都有很好的支持。