在我们的项目中,我们使用ShedLock来防止并发执行预定的Spring任务。有时我们需要手动调用此任务,因此我们在前端添加了一个按钮,当单击该按钮时,将调用(API)此任务。现在,我们可以使用ShedLock,这样当用户多次单击按钮时,它将只执行任务一次,并锁定到任务完成。
发布于 2018-07-16 05:50:52
你当然可以用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。
发布于 2018-08-03 20:41:07
在API方法中,uou可以手动使用锁,如documentation中所述
LockingTaskExecutor executor // injected by Spring
...
Instant lockAtMostUntil = Instant.now().plusSeconds(600);
executor.executeWithLock(runnable, new LockConfiguration("lockName", lockAtMostUntil));发布于 2019-01-11 20:39:03
您是否尝试过使用代理方法?
@EnableSchedulerLock(mode = PROXY_METHOD, defaultLockAtMostFor = "PT30S")https://github.com/lukas-krecan/ShedLock#scheduled-method-proxy
https://stackoverflow.com/questions/51192966
复制相似问题