避免在 Spring Boot 中跨多个 Nginx 服务器重复执行计划任务

问题描述 投票:0回答:1

我在两台 Nginx 服务器上部署了一个 Spring Boot 应用程序。它包含一个每日计划任务,用于使用 @Scheduled 注释生成报告,这会触发 addDailyReports 方法。

问题是计划任务在两台服务器上同时运行,导致数据库中出现重复的报告。这是我的代码的简化版本:

public void runDailyTask() {
    branchUserService.addDailyReports(null, null);
}

@Override
public String addDailyReports(LocalDate date, Long branchCode) {
    LocalDate reportDate = (date != null) ? date : LocalDate.now();
    
    Long count = branchUserMakerRepos.getCountByReportdateAndReporeFrequency(reportDate, "Daily");
    if (count > 0) {
        return count + " reports exist for the report date " + reportDate;
    }`enter code here`
    
    // Other code to generate reports...
}

我尝试使用数据库锁定来防止重复执行,但它没有按预期工作。在这里使用@Transactional可以解决问题吗?如果不是,还有哪些方法可以防止此计划任务在跨多个服务器部署时执行两次?

spring-boot nginx scheduler spring-scheduled database-locking
1个回答
0
投票

我建议使用 Shedlock 依赖项,因为它可以确保您的任务一次只执行一次。 要为日常任务启用 Shedlock:

@Scheduled(...)
@SchedulerLock(name = "MY_DAILY_TASK")
public void runDailyTask() {
   branchUserService.addDailyReports(null, null);
}

在幕后,Shedlock 会向数据库中的 shedlock 表添加一个新行(有关配置详细信息,请参阅文档)。这可以确保您的日常任务不会执行两次。

并且不要忘记在应用程序类上启用计划锁定:

@EnableSchedulerLock(...)
class MyApplication {
    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.