我应该在休息控制器中使用@Scheduled 还是睡眠?

Should I use @Scheduled or sleep in rest controller?

我需要在从前端调用我的休息控制器后调用一些延迟的动作。例如,在使用方法 Update 调用端点 /controller 之后。我想获得响应状态 OK 并在控制器调用调度程序中,它将在调用端点后 15 分钟后对数据库中的实体执行一些更新功能。我只想简单地延迟更改 2 个布尔字段。我应该使用什么? @Schedule 注释或只是睡觉或其他什么?我将不胜感激所有建议。

此致!

@Scheduled 用于定期执行某个方法。对于你想要的,你应该使用 ScheduledExecutor class。有关详细信息,请参阅文档 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

它有两种方法,scheduleWithFixedDelay 方法是您要使用的方法。

编辑:这是一个例子

final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
         //Do you database save here
    }
}, 0, 15, TimeUnit.MINUTES);

编辑 2:

也许使用 schedule() 方法更简单,因为您只进行一次更新。上面的示例适用于当您有多个操作必须连续完成且执行之间有 15 分钟的固定延迟时。对于一次执行,您可以使用:

executorService.schedule(() -> database.save(), 15, TimeUnit.MINUTES);
executorService.shutdown();

代码() -> database.save()被称为lambda表达式。 在计划调用之后调用 shutdown 很重要,否则您可能会发生内存泄漏。 shutdown() 方法将等待 executorService 队列中的线程被执行,之后它会销毁使用的线程。