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 上再次运行它。但这两个实例都开始运行该任务。我是不是错过了什么。执行过程中有什么问题吗?有人可以提供任何想法吗?谢谢 !!
dlock通过使用数据库索引和约束来保证在任何时候都拥有一把锁。您可以简单地执行如下操作。
@Scheduled(cron = "30 30 3 * * *")
@TryLock(name = "onlineIngestionTask", owner = SERVER_NAME, lockFor = 240000)
public void pullTasksFromRemote() {
}
Run Code Online (Sandbox Code Playgroud)
请参阅有关使用它的文章。
| 归档时间: |
|
| 查看次数: |
25539 次 |
| 最近记录: |