【问题标题】:Spring Scheduler advantage of using cron expression vs fixed delaySpring Scheduler 使用 cron 表达式与固定延迟的优势
【发布时间】:2019-04-25 21:50:37
【问题描述】:

我在 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");
}

【问题讨论】:

    标签: java spring cron scheduler


    【解决方案1】:

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

    【讨论】:

    • cron 表达式是否等待上一次运行完成执行?
    【解决方案2】:

    Cron 表达式和 fixedDelay 用于提供自定义的调度选项,并且对性能本身没有影响。提高 deleteUnusedFiles 方法的性能是对您的应用程序性能非常重要的唯一选择。如果我可以使用 fixedDelay 实现我想要的,我更喜欢 fixedDelay 而不是 cron。

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 1970-01-01
      • 2013-05-23
      • 2019-02-10
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      相关资源
      最近更新 更多