我们可以使用Shedlock锁定API调用吗

时间:2018-07-05 13:45:51

标签: spring rest api locking spring-scheduled

在我们的项目中,我们使用ShedLock防止并发执行计划的Spring任务。有时我们需要手动调用此任务,因此在前端我们添加了一个按钮,单击该按钮将调用此任务(API)。现在我们可以使用ShedLock了,以便当用户多次单击按钮时,它将只执行一次任务并锁定直到完成。

3 个答案:

答案 0 :(得分:1)

您当然可以使用dlock来做到这一点。想象一下,控制器A和服务A在其中控制器A调用服务A。如果在服务A上有一个方法doSomeWork,并用dlock注释,则可以从控制器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

答案 1 :(得分:0)

通过API方法,uou可以按照documentation

中的说明手动使用锁。
LockingTaskExecutor executor // injected by Spring
...

Instant lockAtMostUntil = Instant.now().plusSeconds(600);
executor.executeWithLock(runnable, new LockConfiguration("lockName", lockAtMostUntil));

答案 2 :(得分:0)

您尝试使用代理方法吗?

private

https://github.com/lukas-krecan/ShedLock#scheduled-method-proxy