我在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");
}
答案 0 :(得分:0)
Cron表达式和fixedDelay用于提供自定义的调度选项,因此对性能没有影响。改善 deleteUnusedFiles 方法性能是唯一与应用程序性能密切相关的选项。如果我可以使用fixedDelay实现我想要的功能,那么我宁愿使用fixedDelay而不是cron。
答案 1 :(得分:0)
它可能会影响您的系统稳定性。 考虑一下您的应用程序有3个不同的实例(只是一个数字)的情况,其中您还具有@Scheduled注释。如果您在不同时间执行计划任务,那么如果您已部署在地理位置不同的3台不同服务器中(例如,美国的一台服务器,新加坡的一台服务器,其他地方的另一台服务器),则有可能复制工作以及可能的错误方案。 (取决于您的Scheduler逻辑)。但是当涉及到Crons时,您可以定义确切的时区类型来启动Job,这意味着无论您的实例运行在哪个国家/地区,该作业都会在每个实例的唯一时间执行。而且,如果您考虑使用Kubernetes中的分支,那么理想情况下,它仅维护一个实例来完成工作,如果失败,则只有Kubernetes会为您创建另一个调度程序实例。因此有所不同,但是您仍然可以根据调度程序内部的实际情况做出决定。