【问题标题】:Should I use @Scheduled or sleep in rest controller?我应该在休息控制器中使用@Scheduled 还是休眠?
【发布时间】:2020-04-07 08:25:48
【问题描述】:

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

最好的问候!

【问题讨论】:

    标签: java spring rest spring-boot scheduled-tasks


    【解决方案1】:

    @Scheduled 用于定期执行某个方法。对于您想要的,您应该使用 ScheduledExecutor 类。有关详细信息,请参阅文档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 队列中的线程执行完毕,然后销毁使用的线程。

    【讨论】:

    • @SnoozeSnoze 不客气,如果这解决了您的问题,请通过单击确定标志接受我的帖子作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2019-01-21
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多