gpt4 book ai didi

java - Spring Scheduled fixedRate 无法正常工作

转载 作者:行者123 更新时间:2023-11-30 06:04:23 25 4
gpt4 key购买 nike

正如标题所说,我正在尝试使用 Scheduled 注释的 fixedRate 参数来每秒调用一个函数。这是我正在使用的代码:

  //execute once every second
@Scheduled(fixedRate = 1000)
private void pullLiveDataFromExternalServer() throws InterruptedException {

System.err.println("START THREAD " + Thread.currentThread().getId());
Thread.sleep(5500L);
System.err.println("END THREAD " + Thread.currentThread().getId());

}

按照我的理解,函数应该在打印第一个“END THREAD”之前打印五次“START THREAD”。

问题是该函数首先打印“START THREAD”然后等待 5.5 秒,打印“END THREAD”,然后继续“START THREAD”等等......看起来调度程序等待上一个执行在开始新的执行之前完成,但 fixedRate 属性不应该是这种情况。

我仔细阅读了一下,发现 @Scheduled 注释的默认调度程序只有一个线程,因此我创建了一个配置以将池大小更改为 8。

@Component
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(8);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}

但是 fixedRate 属性的行为没有改变,调度程序仍在等待上一次执行结束,然后再开始新的执行。为什么会这样?

我使用的spring boot版本是v1.5.8.RELEASE。

最佳答案

It looks like the scheduler waits for the previous execution to finish before it starts the new execution

这是正确的,并且是预期的行为。每个计划任务,无论 fixedRatefixedDelay,都不会并行运行。即使调用时间比配置的 fixedRate 更长,也是如此。

最终,固定速率调度会调用 ScheduledExecutorService.scheduleAtFixedRate。它的 javadoc 声明如下:

If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.

如果同一计划任务的多次调用可以并行运行,那么您问题中的示例将耗尽所有可用线程。每 1000 毫秒将使用一个新线程,并且每 5500 毫秒才会再次使用一个线程。

关于java - Spring Scheduled fixedRate 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com