java - 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");
}
解决方案
它可能会影响您的系统稳定性。想一想您有 3 个不同(它只是一个数字)应用程序实例的情况,其中您也有 @Scheduled 注释。如果您已经部署在 3 台不同的服务器中,这些服务器位于相当不同的地理位置(例如,一台服务器在美国,一台在新加坡,另一台在其他地方)如果计划任务正在不同的时间实例执行,则可能有可能重复工作和可能的错误场景。(这取决于您的调度程序逻辑)。但是当涉及到 Cron 时,您可以定义确切的时区类型来启动作业,这意味着无论您的实例在哪个国家/地区运行,该作业都将在每个实例中的唯一时间执行。如果您考虑 Kubernetes 中的 crons,则更重要的是,理想情况下,它只维护一个实例来完成这项工作,如果它失败了,只有 Kubernetes 会为你创建另一个调度程序实例。因此存在差异,但您仍然可以根据您在调度程序中的实际操作做出决定。
推荐阅读
- reactjs - 将 Creative Tim 的 react kit 与 Creative Tim 的仪表板集成,然后与 React-Redux-Firebase 后端集成
- ios - Firebase 是否在 iOS 应用程序中使用钥匙串?
- c# - URL 路由在 WordPress 站点上的 .NET 虚拟目录中不起作用
- rxjs - Rxjs6:无法处理异步函数中的错误
- c# - 从达到的最后一个级别继续游戏
- javascript - 地图没有返回正确的对象数组
- java - 空对象引用上的 void android.widget.ImageView.setEnabled(boolean)'
- python - 如何使用 PyTorch 中的单个全连接层直接将输入连接到输出?
- ruby-on-rails - ActiveStorage CSV 文件强制编码?
- javascript - 单击带有 asp.net core MVC 的按钮后显示模式