首页 > 解决方案 > Spring Scheduler 使用 cron 表达式与固定延迟的优势

问题描述

我在 Java8 项目中有一个方法使用 Spring @Scheduled 注解以固定延迟运行并调用删除方法。

使用 cron 表达式而不是延迟字符串在性能或系统稳定性方面是否有优势?

在下面添加当前实现:

@Scheduled(fixedDelayString = "${cleanup.unused.files.frequency}")
public void deleteUnusedFiles() throws IOException {
    LOGGER.info("Unused data files deletion started");
    recursiveDeleteFilesOlderThanNDays(unusedFileAgeThreshold, unusedFilesPath);
    LOGGER.info("Unused data files deletion completed");
}

标签: javaspringcronscheduler

解决方案


它可能会影响您的系统稳定性。想一想您有 3 个不同(它只是一个数字)应用程序实例的情况,其中您也有 @Scheduled 注释。如果您已经部署在 3 台不同的服务器中,这些服务器位于相当不同的地理位置(例如,一台服务器在美国,一台在新加坡,另一台在其他地方)如果计划任务正在不同的时间实例执行,则可能有可能重复工作和可能的错误场景。(这取决于您的调度程序逻辑)。但是当涉及到 Cron 时,您可以定义确切的时区类型来启动作业,这意味着无论您的实例在哪个国家/地区运行,该作业都将在每个实例中的唯一时间执行。如果您考虑 Kubernetes 中的 crons,则更重要的是,理想情况下,它只维护一个实例来完成这项工作,如果它失败了,只有 Kubernetes 会为你创建另一个调度程序实例。因此存在差异,但您仍然可以根据您在调度程序中的实际操作做出决定。


推荐阅读