如何在Spring引导中使用Shedlock释放调度器的锁



我创建了一个调度程序,每30秒运行一次。@Scheduled(fixedRateString = "${scheduler.time:30000}")

为此,Shedlock已配置为@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")

我在Shedlock表中有一个条目:

lock_until : 2021-07-20 14:53:26.446

locked_at : 2021-07-20 14:53:24.585

并且调度程序根本没有运行。

我有几个问题:

  1. 锁不是应该在30秒后松开吗?

  2. 运行调度程序和Sherlock的时间是否与导致问题的30秒相同?

  3. 既然我被卡住了,怎么解除锁?我应该删除shedlock表中的条目吗?

谢谢。

  1. 据我所知,锁在释放之前会被扩展。

  2. 没有。当您在本地运行指向测试环境的应用程序时,您不会获取锁,因为它已经被运行在测试环境中的应用程序锁定。您的本地实例获取锁的可能性较小,但如果发生这种情况,则计划的作业将不会在测试环境中执行。

  3. 我不建议从数据库中删除shedlock条目。相反,您应该使用@SchedulerLock对计划任务方法进行注释,并提供一个锁名称。所以,当您在本地运行应用程序只是为了临时更改锁名时,这样它就不会和测试环境中的锁名冲突。

@Scheduled(fixedRateString = "${scheduler.time:30000}")
@SchedulerLock(name = "scheduledTaskLockName", lockAtLeastFor = "PT10S", lockAtMostFor = "PT30S")
public void scheduledTask() {
// scheduled task execution
}

源代码可在GitHub上获取。

最新更新