【发布时间】:2018-07-05 13:45:50
【问题描述】:
在我们的项目中,我们使用 ShedLock 来防止同时执行预定的 Spring 任务。有时我们需要手动调用此任务,因此我们在前端添加了一个按钮,单击该按钮将调用(API)此任务。现在我们可以使用 ShedLock,这样当用户多次点击按钮时,它只会执行一次任务并锁定直到完成。
【问题讨论】:
标签: spring rest api locking spring-scheduled
在我们的项目中,我们使用 ShedLock 来防止同时执行预定的 Spring 任务。有时我们需要手动调用此任务,因此我们在前端添加了一个按钮,单击该按钮将调用(API)此任务。现在我们可以使用 ShedLock,这样当用户多次点击按钮时,它只会执行一次任务并锁定直到完成。
【问题讨论】:
标签: spring rest api locking spring-scheduled
您当然可以使用dlock 做到这一点。想象一下控制器 A 和服务 A,其中控制器 A 调用服务 A。如果您在服务 A 处有一个由 dlock 注释的方法 doSomeWork,您可以安全地从控制器 A 调用该方法,并且它只会运行一次服务直到超时。这是一个具体的例子。
服务 A 应该是这样的。
@TryLock(name = "doSomeWork", owner = "serviceA", lockFor = ONE_MINUTE)
public void doSomeWork() {
//...
}
控制器 A 是这样的。
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public void doSomeWork() {
serviceA.doSomeWork();
}
更多信息请参见this post。
【讨论】:
通过API方法,你可以手动使用锁,如documentation中所述
LockingTaskExecutor executor // injected by Spring
...
Instant lockAtMostUntil = Instant.now().plusSeconds(600);
executor.executeWithLock(runnable, new LockConfiguration("lockName", lockAtMostUntil));
【讨论】:
您是否尝试过使用代理方法?
@EnableSchedulerLock(mode = PROXY_METHOD, defaultLockAtMostFor = "PT30S")
https://github.com/lukas-krecan/ShedLock#scheduled-method-proxy
【讨论】: