我创建了一个调度程序,每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
并且调度程序根本没有运行。
我有几个问题:
-
锁不是应该在30秒后松开吗?
-
运行调度程序和Sherlock的时间是否与导致问题的30秒相同?
-
既然我被卡住了,怎么解除锁?我应该删除shedlock表中的条目吗?
谢谢。
-
据我所知,锁在释放之前会被扩展。
-
没有。当您在本地运行指向测试环境的应用程序时,您不会获取锁,因为它已经被运行在测试环境中的应用程序锁定。您的本地实例获取锁的可能性较小,但如果发生这种情况,则计划的作业将不会在测试环境中执行。
-
我不建议从数据库中删除shedlock条目。相反,您应该使用
@SchedulerLock
对计划任务方法进行注释,并提供一个锁名称。所以,当您在本地运行应用程序只是为了临时更改锁名时,这样它就不会和测试环境中的锁名冲突。
@Scheduled(fixedRateString = "${scheduler.time:30000}")
@SchedulerLock(name = "scheduledTaskLockName", lockAtLeastFor = "PT10S", lockAtMostFor = "PT30S")
public void scheduledTask() {
// scheduled task execution
}
源代码可在GitHub上获取。