我们开始使用 ShedLock,每天需要运行两个任务。因此,我在一个类中定义了两个具有不同锁名称的任务(以便它们可以同时运行)。我为展位作业设置了相同的执行开始时间。但由于某种原因,这些任务是在两个实例上执行的(我们总共有 3 个实例)。在 tst 上它运行良好(可能是因为数据集较小)。我试图理解为什么。
这是我的课:
@Service
public class ProcessDataScheduledService {
private final MyService myService;
@Scheduled(cron = "0 0 1 * * *")
@SchedulerLock(name = "task1"
lockAtLeastFor = "PT1H",
lockAtMostFor = "PT1H")
public void processData1() {
myService.doSomething_1();
}
@Scheduled(cron = "0 0 1 * * *")
@SchedulerLock(name = "task2",
lockAtLeastFor = "PT1H",
lockAtMostFor = "PT1H")
public void processData2() {
myService.doSomething_2();
}
}
锁提供者:
public LockProvider lockProvider(@Qualifier("pgsqlDataSource") DataSource dataSource) {
return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(new JdbcTemplate(dataSource))
.usingDbTime()
.build());
}
以下是有关任务开始和结束的信息:
task1 host = server_1, time execution: 01:00:00.313 --- 02:02:54.695
task2 host = server_1, time execution: 02:02:54.709 --- 05:25:02.066
task2 host = server_2, time execution: 01:00:00.321 --- 04:21:13.377
task1 host = central_2, time execution: 04:21:13.398 --- 05:19:08.828