Shedlock在数据库中为单个作业创建多个条目

时间:2018-09-13 08:01:27

标签: spring-boot

我们正在使用shedlock在用于容器的Azure Web应用程序上进行集群。现在我的衣服看起来像:

@Scheduled(cron = "0 0 0/3 * * ?")
@SchedulerLock(name = "giveBonus", lockAtMostFor = TWO_HOURS, lockAtLeastFor = TWO_HOURS)
public void giveBonus() {

}

我的锁锁代码如下:

@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);
}

现在,大多数情况下,我看到即使我们有一个应用程序实例,在数据库中还是有几乎同时创建的具有相同作业名称的多个条目。请查看代码段:

database-snaphot

我们无法弄清楚的是,如果这是正确的行为,或者我们在这里做错了。

我们使用的密码锁版本为:1.1.0

2 个答案:

答案 0 :(得分:0)

您需要在“名称”列(主键)上具有唯一性约束

答案 1 :(得分:0)

我认为您需要数据库constraints。您当然可以使用dlock来做到这一点。它的实现是特定于数据库的,例如使用数据库索引来确保一次锁一次。

服务A应该是这样的。

@TryLock(name = "giveBonus", owner = "your-owner", lockFor = TWO_HOURS)
public void giveBonus() {
  //...
}

有关更多信息,请参见this post