我有一个简单的 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”不同,但没有发生任何有趣的事情)。