如果服务的多个实例正在运行,我将使用Shedlock只运行一次scheduler任务。
我遵循了documentation,这就是我所做的。
这是需要定期运行的函数
@Scheduled(fixedDelayString = "300000")
@SchedulerLock(name = "onlineIngestionTask", lockAtMostFor = 240000, lockAtLeastFor = 240000)
public void pullTasksFromRemote() {
//Code
}在我的config类中,我有以下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);
}该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>我在我的数据库中添加了一个表,jdbc连接到的那个表。
CREATE TABLE shedlock(
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
) 在此之后,我尝试通过首先在端口8080上运行tha来测试功能。然后,我使用server.port=9000在端口9000上再次运行它。但是这两个实例都开始运行任务。我是不是错过了什么。在实现中有什么问题吗?有没有人能给出一些想法。谢谢!!
发布于 2018-10-28 00:58:35
发布于 2020-05-29 05:13:19
我们最近在prod中遇到了这个问题,在那里我们可以看到shedlock调度程序的多次运行。如果您使用的是spring boot 2.2.1.RELEASE及更高版本,请使用下面的deps for shedlock
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.9.3</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-spring</artifactId>
<version>4.8.0</version>
</dependency>发布于 2020-08-24 13:14:05
请尝试在@scheduled中使用cron表达式,而不是在每小时运行一次的调度程序下面使用fixedDelayString。
@Scheduled(cron = "0 */1 * * *")https://stackoverflow.com/questions/45561558
复制相似问题