gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:57:28 24 4
gpt4 key购买 nike

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

我想做以下事情:

  1. 每小时从数据库中清理一些数据
  2. 每 15 分钟生成一次数据统计信息并将其存储在某个 XML 文件中

问题是:目前我的所有代码都是根据从客户端收到的请求运行的。

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

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

最佳答案

您可以使用 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();
}

关于java - 在服务器端为 servlet JSP MVC 网站运行定期任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com