我有一个 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
表仍然为空。根据故障排除部分的第二项,我似乎错过了一些配置,但我不知道是什么。
任何帮助将不胜感激。