春季引导中的默认调度程序池大小是多少?

2022-08-31 14:55:28

我正在使用和注释来执行一些任务。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);
    }
}

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


答案 1

是的,默认情况下,所有方法共享一个线程。可以通过定义如下所示的方法来覆盖此行为:@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);
    }
}

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


答案 2

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

spring.task.scheduling.pool.size=20

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


推荐