Shedlock只在一个实例上工作,而不是多个实例



我想设置Shedlock来保护一个敏感进程,这样即使启动了多个应用程序进程,也只运行该进程的一个实例。

In my 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>

DB:

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
}
}

症状:如果我只启动一个具有多个schedulea类的实例,如scheduleb, schedulec等,这些都是相同代码的副本,我可以看到Shedlock做它的事情,一次只允许一个LOCAL实例执行。但是,当我启动多个Spring Boot应用程序时,即使它们使用相同的DB,相同的表,相同的调度程序名称,它们也会并发地执行所有调度程序。我还注意到DB表中没有条目,但是调试日志也没有显示错误。

问题:这是Shedlock所期望的行为吗?我应该研究另一个解决方案,还是我错配置了什么?

您需要根据文档将@EnableSchedulerLock添加到您的配置类中:"为了启用时间表锁定,使用@EnableSchedulerLock注释">

您需要在spring引导应用程序启动的主类上添加带有强制参数defaultLockAtMostFor的@EnableSchedulerLock注释。它将防止同一个spring引导应用程序的多个实例同时运行计划任务。

相关内容

  • 没有找到相关文章

最新更新