当前位置: 首页 > 知识库问答 >
问题:

Spring排定固定速率工作不正常

卫昊东
2023-03-14

正如标题所说,我正在尝试使用排定注释的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());

  }

按照我的理解,在打印第一个“结束线程”之前,函数应该打印五次“开始线程”。

问题是函数先打印“开始线程”然后等待5.5秒,打印“结束线程”,然后走“开始线程”,以此类推……看起来调度程序在启动新的执行之前等待前一个执行完成,但fixedRate属性不应该是这种情况。

我仔细阅读了一下,发现@Scheduled annotation的默认调度程序只有一个线程,所以我创建了一个配置,将池大小更改为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属性的行为没有改变,调度程序在启动新的执行之前仍在等待前一次执行结束。为什么会出现这种情况?

共有1个答案

邵赞
2023-03-14

在启动新的执行之前,排定程序会等待前一个执行完成

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

最终,固定速率调度会导致调用scheduledexecutorService.scheduleatfixedrate。其javadoc声明如下:

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

 类似资料:
  • 我正在开发一个应用程序,该应用程序应该每隔X秒从网络下载一个文件,以检查是否有任何更改。我使用一个服务来完成这项工作,但它的执行并不随延迟时间率而固定,这是我的服务代码: 输出不是固定的,它应该每10秒运行一次,同时以随机方式运行服务

  • 我有一个部分,其中左div是固定的,右div是可滚动的,但右div内容滚动,甚至在滚动顶部到达该部分之前。我想要右div滚动只有当它到达div的顶部或底部时(当从底部向上滚动时),但它滚动任何它想要的(不一致-当我快速滚动时,它开始滚动在节的中间,等等)。 当我快速向上或向下滚动时,它甚至会跳过这一节,但我希望它永远不会被跳过。 尝试快速和慢速滚动。卷轴可以随时工作: JSFiddle示例 代码:

  • 我不能玩春云之门的限速器。我在这里配置网关: 我使用JMeter调用API循环1000次,但网关没有响应429响应中的请求太多。我哪里错了?

  • 将Blockly放入网页的最简单方法是将其注入空的“div”标签。 注入 首先,包括核心Blockly脚本和核心模块。请注意,路径可能会有所不同,具体取决于您的网页与Blockly文件相关的位置: <script src="blockly_compressed.js"></script> <script src="blocks_compressed.js"></script> 然后包含用户语言的消

  • 如果我使用的术语不正确,我必须首先道歉。我只使用Groovy/Java来完成自动化任务(Gradle),而且我没有多年交付生产级软件的经验。 因此,我面临的挑战如下:我有一个规范,它试图测试返回字符串是否符合预期(几乎与此相同)。 然而,不同之处在于,我的方法约束返回一个主体对象,而我真正想要存根的对象是toString()。我认为我在上面做得正确,但它没有给出我期望的结果。 这是我的帮手班。 如

  • 我正在开发一个应用程序,它需要每x分钟上线一次,检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是这种解决方案的最佳方法是什么?< code >处理程序或< code >计时器对象?