首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shedlock只工作于一个实例,而不是多个实例。

Shedlock只工作于一个实例,而不是多个实例。
EN

Stack Overflow用户
提问于 2021-10-14 06:09:44
回答 2查看 1.4K关注 0票数 1

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

在我的pom.xml里

代码语言:javascript
复制
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>net.javacrumbs.shedlock</groupId>
            <artifactId>shedlock-provider-jdbc-template</artifactId>
        </dependency>

我的数据库:

代码语言:javascript
复制
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));

我的配置:

代码语言:javascript
复制
@Configuration
@EnableScheduling
public class ShedlockConfiguration {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(
                JdbcTemplateLockProvider.Configuration.builder()
                        .withJdbcTemplate(new JdbcTemplate(dataSource))
                        .usingDbTime() 
                        .build()
        );
    }

}

我的日程安排:

代码语言:javascript
复制
@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的预期行为吗?我应该研究另一种解决方案,还是我配置错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-14 09:22:06

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

票数 0
EN

Stack Overflow用户

发布于 2021-10-14 09:28:10

您需要在您的主类中添加@EnableSchedulerLock注释,并在spring启动应用程序的起始位置上使用defaultLockAtMostFor作为强制参数。它将防止同一个spring引导应用程序的多个实例同时运行预定任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69565824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档