Java Spring shedlock失败
我有一个SpringBoot应用程序,它在生产环境中以2个实例运行,导致计划任务运行两次。为了避免这种情况,我尝试使用shedlock,正如前面解释的和,但它没有任何影响。 我已经在使用一个MySql数据库,我在其中添加了一个Java Spring shedlock失败,java,spring-boot,scheduled-tasks,shedlock,Java,Spring Boot,Scheduled Tasks,Shedlock,我有一个SpringBoot应用程序,它在生产环境中以2个实例运行,导致计划任务运行两次。为了避免这种情况,我尝试使用shedlock,正如前面解释的和,但它没有任何影响。 我已经在使用一个MySql数据库,我在其中添加了一个shedlock表,正如上面两个例子所解释的 我的项目结构如下(部分)- 在我的application.properties文件中,我有以下设置- db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localho
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
class i中添加了此注释-
@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...
}
当我在两个实例上本地运行应用程序时(使用application.properties
文件中的两个不同端口),查看日志,我可以看到任务在两个实例上运行,同时shedlock
表仍然为空。
根据本节的第二项,我似乎错过了一些配置,但我不知道是什么
任何帮助都将不胜感激。很显然,在我的大项目中,有另一个配置类(除了
AppConfig
),一个名为SqlSpringConfig
,位于db模块内。
一旦我把
LockProvider
bean放在那里,所有的工作就像一个咒语一样我们将创建一个表ScheduledTask,并创建一个名为start的Bit类型的列。在任务开始时检查其值。当任务开始执行时,将其设置为1。如果已经是1,不要开始你的任务。任务完成后再次将其设置为0!