Java Spring锁失败

问题描述

我有一个spring-boot应用程序,该应用程序在生产环境中在2个实例中运行,导致计划的任务运行两次。为避免我尝试使用伪锁,如herehere所述,但这没有影响。 我已经在使用MysqL数据库,并在其中添加shedlock表,如上面两个示例中所述。

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

enter image description here

在我的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个不同的端口),查看日志时,我可以看到任务在两个实例上都运行,同时{{ 1}}表保持为空。 根据{{​​3}}部分的第二项,我似乎错过了一些配置,但我不知道是什么。

任何帮助将不胜感激。

解决方法

好吧,显然在我的大项目中,db模块内部还有另一个配置类(除了AppConfig之外),一个名为SqlSpringConfig。 一旦我将LockProvider豆放到那里,所有的工作都像一个魅力

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...