我使用servlet和JSP开发了一个Web应用程序。我本身并没有使用任何框架,而是使用我自己的自制MVC框架。我使用MySQL作为后端。
我想做以下事情:
问题是:目前我的所有代码都是从客户端收到的请求运行的。
如何在服务器端运行定期任务?
我现在的一个解决方案是在控制器的init函数中创建一个线程。还有其他选择吗?
答案 0 :(得分:41)
您可以使用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
方式将是ScheduledExecutorService
和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();
}
答案 1 :(得分:2)
您可以使用任何调度程序来安排您的过程,例如quartz,spring scheduler
http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html对任何实现都有很好的支持。