如何并行执行更多@Scheduled作业的执行?

问题描述 投票:3回答:1

我有一个这样的实现不起作用。如您所见,作业大约需要5秒,应该在fixedRate 1秒上运行。这意味着应该并行运行约5个作业,但是Spring在开始另一个作业之前会等待完成一项作业...如果我添加第二个@Scheduled作业'schedule2',并且具有相同的参数,那么我将并行运行2个不同的作业,但永远不会有相同的作业。是否有可能实现这一目标?

@Scheduled(fixedRate = 1000)
private void schedule1() {
    int index = atomicInteger1.addAndGet(1); 
    logger.info("Run Schedule1 nr.{} started at: {}", index, LocalDateTime.now());
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        logger.info("Schedule1 nr.{} finished at: {}", index, LocalDateTime.now());
    }
}

@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
    return Executors.newScheduledThreadPool(10);
}
java spring spring-boot
1个回答
0
投票
在这种情况下,

每个计划任务将从不并行运行。这是因为任务花费的时间比给定的fixedRate longer多。为什么?因为ScheduledExecutorService#scheduleAtFixedRate被调用,并且如文档所述(被标记为我的):

...如果此任务的任何执行花费的时间超过其周期,则后续执行可能会延迟开始,但是不会同时执行


0
投票
在这种情况下,

每个计划任务将从不并行运行。这是因为任务花费的时间比给定的fixedRate longer多。为什么?因为ScheduledExecutorService#scheduleAtFixedRate被调用,并且如文档所述:

如果此任务的任何执行花费的时间超过其周期,则后续执行可能会延迟开始,但是不会同时执行

这应该解释为什么您的代码无法按预期工作,其他答案提出了一种可能的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.