0

我有一个 spring-boot 应用程序,它在生产环境中以 2 个实例运行,导致计划任务运行两次。为了避免我正在尝试使用 shedlock,如此处和此处所解释,但它没有影响。我已经在使用 MySql 数据库,我在上面添加了一个shedlock表,如上面两个示例中所述。

我的项目结构如下(部分) -

在此处输入图像描述

在我的application.properties文件中我有这个设置 -

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/b4ad?autoReconnect=true&useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
db.username=*****
db.password=*****

我在AppConfig课堂上添加了这个注释 -

@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

还有这个豆子——

@Bean
public LockProvider lockProvider(DataSource dataSource) {
    return new JdbcTemplateLockProvider(dataSource, "b4ad.shedlock");
}

ScheduledManager课堂上我有这个计划任务 -

 @Scheduled(cron = "0 0/1 * * * ?")
@SchedulerLock(name = "deactivateExpiredOrganizations", lockAtLeastFor = "PT5M")
public void deactivateExpiredOrganizations() {
    // my code...
}

当我在 2 个实例上本地运行我的应用程序(使用application.properties文件中的 2 个不同端口)时,查看日志我可以看到任务在两个实例上运行,同时shedlock表仍然为空。根据故障排除部分的第二项,我似乎错过了一些配置,但我不知道是什么。

任何帮助将不胜感激。

4

1 回答 1

0

好吧,显然在我的大项目中,还有另一个配置类(除了AppConfig) - 一个名为SqlSpringConfig,在 db 模块内。一旦我把LockProvider豆子放在那里,一切都像魅力一样

于 2020-10-01T12:30:53.737 回答