Можем ли мы использовать Shedlock для блокировки вызовов API - PullRequest
0 голосов
/ 05 июля 2018

В нашем проекте мы используем ShedLock для предотвращения одновременного выполнения запланированной задачи Spring. Иногда нам нужно вызывать эту задачу вручную, поэтому к нашему интерфейсу мы добавили кнопку, которая при нажатии вызовет (API) эту задачу. Теперь мы можем использовать ShedLock, чтобы, когда пользователь нажимает кнопку несколько раз, он выполнял задачу только один раз и блокировал ее до завершения.

Ответы [ 3 ]

0 голосов
/ 03 августа 2018

Используя метод API, вы можете использовать блокировку вручную, как описано в документации

LockingTaskExecutor executor // injected by Spring
...

Instant lockAtMostUntil = Instant.now().plusSeconds(600);
executor.executeWithLock(runnable, new LockConfiguration("lockName", lockAtMostUntil));
0 голосов
/ 11 января 2019

Вы пытались использовать метод прокси?

@EnableSchedulerLock(mode = PROXY_METHOD, defaultLockAtMostFor = "PT30S")

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

0 голосов
/ 16 июля 2018

Вы, конечно, можете сделать это с dlock . Представьте себе контроллер A и службу A, где контроллер A вызывает службу A. Если у вас есть метод doSomeWork в службе A, аннотированный dlock, вы можете безопасно вызывать метод из контроллера A столько раз, сколько вам нужно, и он будет запускать службу только один раз. до времени ожидания Вот конкретный пример.

Служба А должна быть примерно такой.

@TryLock(name = "doSomeWork", owner = "serviceA", lockFor = ONE_MINUTE)
public void doSomeWork() {
  //...
}

Контроллер А будет примерно таким.

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public void doSomeWork() {
  serviceA.doSomeWork();
}

См. этот пост для получения дополнительной информации.

...