我应该在休息控制器中使用@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 队列中的线程被执行,之后它会销毁使用的线程。
我需要在从前端调用我的休息控制器后调用一些延迟的动作。例如,在使用方法 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 队列中的线程被执行,之后它会销毁使用的线程。