1

我有一个简单的 Spring Boot (2.5) 应用程序,可以一次从多个来源获取多个数据。我创建了 3 个工作类别,每个类别都有几项任务要做。第一个有两个任务(在不同的方法中定义)要做,第二个有 3 个,第三个有 2 个 - 总共有 7 个。每个工作都有这样的结构:

@Component
public class FirstJob {
    [...]
    @Scheduled(cron = "0 * * * * *")
    public void getLastTaskStatistics() {
        [...]
    }
    @Scheduled(cron = "0 * * * * *")
    public void getMetersStatusCount() {
        [...]
    }
}

@Component
public class SecondJob {
    [...]
    @Scheduled(cron = "0 * * * * *")
    public void getIndexStats() {
        [...]
    }
    @Scheduled(cron = "0 * * * * *")
    public void getCollectionStats() {
        [...]
    }
    @Scheduled(cron = "0 * * * * *")
    public void getActiveMetersStats() {
        [...]
    }
}

第三个也是一样。如您所见,所有方法都有固定且相同的触发时间。一切工作几乎正常,但我想在可用的执行线程池中并行执行它们:实际上观察是不同的,所有任务都在单个执行任务(始终命名为调度-1)中执行,并且也是按顺序执行的。日志的一部分:

2021-05-04 14:39:00.020  INFO 9004 --- [   scheduling-1] FirstJob   : getMetersStatusCount: start
2021-05-04 14:39:00.166  INFO 9004 --- [   scheduling-1] FirstJob   : getMetersStatusCount: end
2021-05-04 14:39:00.166  INFO 9004 --- [   scheduling-1] FirstJob   : getLastTaskStatistics: start
2021-05-04 14:39:00.235  INFO 9004 --- [   scheduling-1] FirstJob   : getLastTaskStatistics: end
2021-05-04 14:39:00.235  INFO 9004 --- [   scheduling-1] SecondJob  : getActiveMetersStats: start
2021-05-04 14:39:05.786  INFO 9004 --- [   scheduling-1] SecondJob  : getActiveMetersStats: end
2021-05-04 14:39:05.786  INFO 9004 --- [   scheduling-1] SecondJob  : getCollectionStats: start
2021-05-04 14:39:05.833  INFO 9004 --- [   scheduling-1] SecondJob  : getCollectionStats: end
2021-05-04 14:39:05.833  INFO 9004 --- [   scheduling-1] SecondJob  : getIndexStats: start
2021-05-04 14:39:05.902  INFO 9004 --- [   scheduling-1] SecondJob  : getIndexStats: end
2021-05-04 14:39:05.902  INFO 9004 --- [   scheduling-1] ThirdJob   : getExchangesDetails: start
2021-05-04 14:39:06.187  INFO 9004 --- [   scheduling-1] ThirdJob   : getExchangesDetails: end
2021-05-04 14:39:06.187  INFO 9004 --- [   scheduling-1] ThirdJob   : getQueueDetails: start
2021-05-04 14:39:06.303  INFO 9004 --- [   scheduling-1] ThirdJob   : getQueueDetails: end

请帮助我:如何避免 Quartz 执行器的单个实例并在所有作业中并行运行所有任务?application.properties 中的 Quartz 自动配置基于默认值,除了:

spring.quartz.properties.org.quartz.scheduler.batchTriggerAcquisitionMaxCount=5

(出于实验目的所做的更改,值与默认的“1”不同,但没有发生任何有趣的事情)。

4

3 回答 3

1

您可以配置池大小。默认值为 1。

样本:

spring.task.scheduling.pool.size=10

于 2021-05-04T14:35:12.100 回答
0

感谢 Ezequiel,设置以下内容就足够了:

spring.task.scheduling.pool.size=10

在 application.properties 中,现在所有任务同时启动。

于 2021-05-05T06:56:06.710 回答
0

为什么不尝试异步方法,即从单个@scheduled方法以异步方式调用其他方法。

你可以按照这里的方法How to asynchronously call a method in Java

例如:

CompletableFuture.runAsync(() -> {
    // method calls
});

或者

CompletableFuture.allOf(
    CompletableFuture.runAsync(() -> ...),
    CompletableFuture.runAsync(() -> ...)
);
于 2021-05-04T14:46:36.543 回答