Shedlock 仅适用于一个实例,但不适用于多个实例
Shedlock only works on one instance, but not multiple
我想设置 Shedlock 来保护一个敏感进程,这样即使启动了多个应用程序进程,也只有该进程的一个实例运行。
在我的pom.xml
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
</dependency>
我的数据库:
CREATE TABLE shedlock(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name));
我的配置:
@Configuration
@EnableScheduling
public class ShedlockConfiguration {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build()
);
}
}
我的日程安排:
@Component
public class SchedulerA {
@Scheduled(initialDelayString = "${examples.scheduler.initial-delay:PT1S}",
fixedDelayString = "${examples.scheduler.fixed-delay:PT10S}")
@SchedulerLock(name = "example_scheduler",
lockAtLeastFor = "${examples.scheduler.lock-at-least:PT5S}",
lockAtMostFor = "${examples.scheduler.lock-at-most:PT30S}")
public void schedule() {
// Implementation not important
}
}
症状:
如果我只启动一个具有多个 SchedulerA 类 的实例,如 SchedulerB、SchedulerC 等,它们都是相同代码的副本,我可以看到 Shedlock 执行它的操作并且一次只允许一个 LOCAL 实例执行。但是,当我启动多个 Spring 引导应用程序时,即使它们使用相同的数据库、相同的 table、相同的调度程序名称,它们也会同时进行所有计划。我还注意到数据库中没有任何条目 table,但调试日志也没有显示任何错误。
问题:
这是 Shedlock 的预期行为吗?我应该研究其他解决方案还是我配置错误?
您需要根据文档将 @EnableSchedulerLock 添加到您的配置中 class:“为了启用计划锁定,请使用 @EnableSchedulerLock 注释”
您需要在 spring 引导应用程序启动的主要 class 上添加带有强制参数 defaultLockAtMostFor 的 @EnableSchedulerLock 注释。它将防止同一 spring 启动应用程序的多个实例同时执行 运行 计划任务。
我想设置 Shedlock 来保护一个敏感进程,这样即使启动了多个应用程序进程,也只有该进程的一个实例运行。
在我的pom.xml
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
</dependency>
我的数据库:
CREATE TABLE shedlock(
name VARCHAR(64) NOT NULL,
lock_until TIMESTAMP NOT NULL,
locked_at TIMESTAMP NOT NULL,
locked_by VARCHAR(255) NOT NULL,
PRIMARY KEY (name));
我的配置:
@Configuration
@EnableScheduling
public class ShedlockConfiguration {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build()
);
}
}
我的日程安排:
@Component
public class SchedulerA {
@Scheduled(initialDelayString = "${examples.scheduler.initial-delay:PT1S}",
fixedDelayString = "${examples.scheduler.fixed-delay:PT10S}")
@SchedulerLock(name = "example_scheduler",
lockAtLeastFor = "${examples.scheduler.lock-at-least:PT5S}",
lockAtMostFor = "${examples.scheduler.lock-at-most:PT30S}")
public void schedule() {
// Implementation not important
}
}
症状: 如果我只启动一个具有多个 SchedulerA 类 的实例,如 SchedulerB、SchedulerC 等,它们都是相同代码的副本,我可以看到 Shedlock 执行它的操作并且一次只允许一个 LOCAL 实例执行。但是,当我启动多个 Spring 引导应用程序时,即使它们使用相同的数据库、相同的 table、相同的调度程序名称,它们也会同时进行所有计划。我还注意到数据库中没有任何条目 table,但调试日志也没有显示任何错误。
问题: 这是 Shedlock 的预期行为吗?我应该研究其他解决方案还是我配置错误?
您需要根据文档将 @EnableSchedulerLock 添加到您的配置中 class:“为了启用计划锁定,请使用 @EnableSchedulerLock 注释”
您需要在 spring 引导应用程序启动的主要 class 上添加带有强制参数 defaultLockAtMostFor 的 @EnableSchedulerLock 注释。它将防止同一 spring 启动应用程序的多个实例同时执行 运行 计划任务。