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