当前位置: 首页 > 面试题库 >

在Servlet JSP MVC网站的服务器端运行定期任务

范承志
2023-03-14
问题内容

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

我要执行以下操作:

  1. 每小时清理一次数据库中的一些数据
  2. 每隔15分钟在XML文件中的某处生成并存储有关数据的统计信息

问题是:当前,我的所有代码都是作为从客户端收到的请求而运行的。

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

我现在有一个解决方案是在控制器的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.
    }
}

Timer但是,在Java
EE中不建议使用。如果任务抛出异常,则整个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();
}


 类似资料:
  • 互联网上的机器之间是怎么相互访问的? 你打开电脑就能相互访问吗?显然需要先接入互联网,也就是常说的“能上网”(插网线、连wifi),这样至少数据信号有途径传播。那么你怎么知道你要连到哪台电脑呢?通过IP地址(门牌号)。每一个接入互联网的电脑都会有一个ip地址,知道某个机器的ip地址就能通过网络协议连接它跟它通信了。 但对于我们来说有一个最大的问题,我们的电脑都是在局域网里的(办公网络、小区宽带都是

  • 我正在尝试在LinuxWeb服务器上使用PHP运行PhantomJS。这最终将作为cron作业运行,但现在我通过一个PHP脚本运行它,我正在通过FTP上传到服务器。 PHP脚本: (请注意,出于隐私考虑,我已将上面路径中的帐户名更改为“accountname”,但这在我的真实脚本中是正确的,并且是从大量其他PHP脚本复制的,这些脚本都可以完美地工作。) myscript.js内容: 结果是: 我在

  • 问题内容: 在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务? 可以说,我有以下任务: 从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f late并且变量也被延迟设置时,存在一个潜在的窗口,并且任务本身可能

  • 我开发了windows服务,用于每隔两分钟检查一些服务是否运行。如果服务未运行,则自动启动它们。 这是我的代码 这是我的app.config档案 错误:“本地计算机上的Windows Search服务已启动,然后停止。如果其他服务或程序未使用某些服务,则会自动停止。”

  • 问题内容: 好的,现在我真的负担不起任何服务的费用。我希望能够使用租用的服务器(基于Linux)拍摄屏幕截图,并将其输出到屏幕上。 我知道有很多服务可以执行此操作,但是它们通常都有限制或水印,或者您必须等待从队列中获取屏幕截图。 有什么办法可以自己截取屏幕截图,然后稍后再缓存它们或其他内容吗?我使用的是PHP,但不仅限于此。我只是在Linux服务器上,所以GD的适当功能无法正常工作。帮帮我!:)

  • 我实现了Spring云任务示例中给出的示例批处理作业示例。其中使用的 Spring 引导版本是 2.0.1.RELEASE。由于我必须移植另一个作业,因此我必须启动云任务,因此我想找到兼容的最旧版本。使用 1.3.2.RELEASE 创建的批处理作业的 jar 作为 Spring 引导版本成功运行。但是当我在将其添加为应用程序后从 Spring 云数据流的 UI 运行它时,出现以下错误: