Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring shedlock失败_Java_Spring Boot_Scheduled Tasks_Shedlock - Fatal编程技术网

Java Spring shedlock失败

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

我有一个SpringBoot应用程序,它在生产环境中以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
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!