问题描述
我有一个spring-boot应用程序,该应用程序在生产环境中在2个实例中运行,导致计划的任务运行两次。为避免我尝试使用伪锁,如here和here所述,但这没有影响。
我已经在使用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=*****
@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个不同的端口),查看日志时,我可以看到任务在两个实例上都运行,同时{{ 1}}表保持为空。
根据{{3}}部分的第二项,我似乎错过了一些配置,但我不知道是什么。
任何帮助将不胜感激。
解决方法
好吧,显然在我的大项目中,db模块内部还有另一个配置类(除了AppConfig
之外),一个名为SqlSpringConfig
。
一旦我将LockProvider
豆放到那里,所有的工作都像一个魅力