ShedLock:运行多个实例多次运行调度程序任务

var*_*nkr 5 java spring scheduled-tasks

如果服务的多个实例正在运行,我只Shedlock运行一次任务。scheduler

我遵循了文档,这就是我所做的。

这是需要定期运行的函数

@Scheduled(fixedDelayString = "300000")
@SchedulerLock(name = "onlineIngestionTask", lockAtMostFor = 240000, lockAtLeastFor = 240000)
public void pullTasksFromRemote() {
        //Code
}
Run Code Online (Sandbox Code Playgroud)

在我的配置类中,我有以下 bean

@Bean
public ScheduledLockConfiguration taskScheduler(LockProvider lockProvider) {
    return ScheduledLockConfigurationBuilder
        .withLockProvider(lockProvider)
        .withPoolSize(10)
        .withDefaultLockAtMostFor(Duration.ofMinutes(10))
        .build();
}



@Bean
public LockProvider lockProvider(DataSource dataSource) {
    return new JdbcTemplateLockProvider(dataSource);
}
Run Code Online (Sandbox Code Playgroud)

pom 包括

<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
    <version>0.14.0</version>
</dependency>

<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
    <version>0.14.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我向数据库添加了一张表,即 jdbc 连接到的表。

CREATE TABLE shedlock(
    name VARCHAR(64), 
    lock_until TIMESTAMP(3) NULL, 
    locked_at TIMESTAMP(3) NULL, 
    locked_by  VARCHAR(255), 
    PRIMARY KEY (name)
) 
Run Code Online (Sandbox Code Playgroud)

此后,我尝试首先在端口 8080 上运行 tha pp 来测试功能。然后我server.port=9000在端口 9000 上再次运行它。但这两个实例都开始运行该任务。我是不是错过了什么。执行过程中有什么问题吗?有人可以提供任何想法吗?谢谢 !!

Wil*_*hes 3

dlock通过使用数据库索引和约束来保证在任何时候都拥有一把锁。您可以简单地执行如下操作。

@Scheduled(cron = "30 30 3 * * *")
@TryLock(name = "onlineIngestionTask", owner = SERVER_NAME, lockFor = 240000)
public void pullTasksFromRemote() {

}
Run Code Online (Sandbox Code Playgroud)

请参阅有关使用它的文章。