我希望设置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执行它的操作,并且一次只允许一个本地实例执行。但是,当我启动多个Spring应用程序时,即使它们使用相同的DB、相同的表、相同的调度程序名称,它们也都是并发的。我还注意到DB表中没有条目,但是调试日志也没有显示错误。
问:这是Shedlock的预期行为吗?我应该研究另一种解决方案,还是我配置错了什么?
发布于 2021-10-14 09:22:06
您需要按照文档将@EnableSchedulerLock添加到您的配置类中:“为了启用计划锁定,请使用@EnableSchedulerLock注释”
发布于 2021-10-14 09:28:10
您需要在您的主类中添加@EnableSchedulerLock注释,并在spring启动应用程序的起始位置上使用defaultLockAtMostFor作为强制参数。它将防止同一个spring引导应用程序的多个实例同时运行预定任务。
https://stackoverflow.com/questions/69565824
复制相似问题