在 Spring-boot 中默认的调度程序池大小是多少?

我使用 spring-boot@Scheduled注释来执行一些任务。

在 Spring-boot 中,如何找出计划任务的默认池大小?

原因: 下面的类不并行执行作业,而是一个接一个地执行。也许默认情况下只配置一个线程执行器?

@Service
public class ZipFileTesterAsync {


@Scheduled(fixedDelay = 60000, initialDelay = 500)
public void run() throws Exception {
System.out.println("import 1");
TimeUnit.MINUTES.sleep(1);
System.out.println("import 1 finished");
}


@Scheduled(fixedDelay = 60000, initialDelay = 1000)
public void run2() throws Exception {
System.out.println("import 2");
TimeUnit.MINUTES.sleep(1);
}
}

结果: 第二个工作在第一个工作完成后执行。

56167 次浏览

是的,默认情况下,所有 @Scheduled方法共享一个线程。 可以通过定义如下 @Configuration来覆盖这种行为:

@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {


@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(100);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}

此示例确保所有 @Scheduled方法共享一个大小为100的线程池。

一个非常简单的方法:

@Configuration
public class ScheduleConfig {
ScheduleConfig(ThreadPoolTaskScheduler threadPoolTaskScheduler) {
threadPoolTaskScheduler.setPoolSize(10);
}
}

Spring-boot 中默认的调度程序池大小为 只有一个

org.springframework.scheduling.config.ScheduledTaskRegistrar:

    /**
* Schedule all registered tasks against the underlying
* {@linkplain #setTaskScheduler(TaskScheduler) task scheduler}.
*/
@SuppressWarnings("deprecation")
protected void scheduleTasks() {
if (this.taskScheduler == null) {
this.localExecutor = Executors.newSingleThreadScheduledExecutor();
this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}
...
}


默认池大小为1,您可以通过更改 spring.task.scheduling.pool.size的值在 application.properties science springboot2.1.0中设置池大小。

spring.task.scheduling.pool.size=20

当触发器周期短于执行持续时间时,将以序列化方式执行相同的任务。SpringBoot 将以最多20个线程并行执行不同的任务。

使用内置的功能和带注释的弹簧配置,这将是这样的:

    @Bean
public TaskScheduler taskScheduler() {
return new ConcurrentTaskScheduler(new ScheduledThreadPoolExecutor(20));
}