将两个不同的 TaskScheduler 绑定到一个 Spring 引导应用程序
Binding two different TaskSchedulers to a Spring Boot Application
我有以下问题:我的应用程序中有多个 @Scheduled
注释定义 cron-jobs,可能同时 运行。据我了解,标准行为是每个 cron-job 都由一个单线程 TaskScheduler
执行,因此一次只能有一个 cron-job 运行,所有其他作业都在排队。这将是我想要的行为,但我的经验是工作 运行 并行。
经过大量搜索后,我发现健康检查下的 class 定义了具有多个线程的 TaskScheduler
。
知道这一点后,我想使用其多线程 TaskScheduler
保留健康检查库并定义另一个 TaskScheduler
,它是单线程的并由我的 @Scheduled
注释使用。
我可以定义一个使用单线程调度程序的 Bean:
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(THREADS_COUNT);
return threadPoolTaskScheduler;
}
但是如何才能将此调度程序仅绑定到我的 @Scheduled
注释?
可以简单地让用@Scheduled 注释的方法调用用@Async("singleThreadScheduledExecutor") 注释的方法。
"multipleThreadScheduledExecutor" 可以 运行 与异步方法并行,当所属的 cron 作业在时间上重叠时,异步方法在 LinkedBlockingQueue 中排队。
要使其发挥作用,还有两件事很重要:
- 自调用 – 从同一个 class 中调用异步方法 – 将不起作用
- 异步方法需要 public
这是必需的,因此 spring 可以围绕这些方法构建代理。
我有以下问题:我的应用程序中有多个 @Scheduled
注释定义 cron-jobs,可能同时 运行。据我了解,标准行为是每个 cron-job 都由一个单线程 TaskScheduler
执行,因此一次只能有一个 cron-job 运行,所有其他作业都在排队。这将是我想要的行为,但我的经验是工作 运行 并行。
经过大量搜索后,我发现健康检查下的 class 定义了具有多个线程的 TaskScheduler
。
知道这一点后,我想使用其多线程 TaskScheduler
保留健康检查库并定义另一个 TaskScheduler
,它是单线程的并由我的 @Scheduled
注释使用。
我可以定义一个使用单线程调度程序的 Bean:
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(THREADS_COUNT);
return threadPoolTaskScheduler;
}
但是如何才能将此调度程序仅绑定到我的 @Scheduled
注释?
可以简单地让用@Scheduled 注释的方法调用用@Async("singleThreadScheduledExecutor") 注释的方法。 "multipleThreadScheduledExecutor" 可以 运行 与异步方法并行,当所属的 cron 作业在时间上重叠时,异步方法在 LinkedBlockingQueue 中排队。 要使其发挥作用,还有两件事很重要:
- 自调用 – 从同一个 class 中调用异步方法 – 将不起作用
- 异步方法需要 public
这是必需的,因此 spring 可以围绕这些方法构建代理。