Shedlock 仅适用于一个实例,不适用于多个实例

问题描述 投票:0回答:3

我想设置 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 Boot 应用程序时,即使它们使用相同的数据库、相同的表、相同的调度程序名称,它们也会同时执行所有调度。我还注意到数据库表中没有任何条目,但调试日志也没有显示任何错误。

问题: 这是 Shedlock 的预期行为吗?我应该研究另一个解决方案还是我配置错误?

spring concurrency scheduled-tasks scheduler shedlock
3个回答
1
投票

您需要按照文档将@EnableSchedulerLock添加到您的配置类中:“为了启用计划锁定,请使用@EnableSchedulerLock注释”


0
投票

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


© www.soinside.com 2019 - 2024. All rights reserved.