【问题标题】:Can we use Shedlock to lock the API calls我们可以使用 Shedlock 来锁定 API 调用吗
【发布时间】:2018-07-05 13:45:50
【问题描述】:

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

【问题讨论】:

    标签: spring rest api locking spring-scheduled


    【解决方案1】:

    您当然可以使用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

    【讨论】:

      【解决方案2】:

      通过API方法,你可以手动使用锁,如documentation中所述

      LockingTaskExecutor executor // injected by Spring
      ...
      
      Instant lockAtMostUntil = Instant.now().plusSeconds(600);
      executor.executeWithLock(runnable, new LockConfiguration("lockName", lockAtMostUntil));
      

      【讨论】:

        【解决方案3】:

        您是否尝试过使用代理方法?

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-14
          • 2019-02-01
          • 1970-01-01
          • 2012-05-20
          • 1970-01-01
          • 2013-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多