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

mem*_*und 27 java spring 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ari*_* Z. 47

是的,@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 对于不同的@Scheduled注释,这可能有不同的thead-pool吗? (3认同)
  • 可以创建不同的 ThreadPoolTask​​Scheduler 并使用 threadPoolTask​​Scheduler.schedule 方法。 (2认同)

rob*_*thy 30

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

spring.task.scheduling.pool.size=20
Run Code Online (Sandbox Code Playgroud)

当触发周期小于执行持续时间时,相同的任务将被串行执行。并且 Spring Boot 会以最多 20 个线程并行执行不同的任务。

  • 我一开始很难找到这个属性的文档,所以这里有一个链接,供其他想要确认这是正确的人使用:https://www.docs4dev.com/docs/en/spring-boot/2.​​1.1 .RELEASE/reference/boot-features-task-execution-scheduling.html (4认同)
  • 请注意,如果您或您的任何依赖项定义了 `SchedulingConfigurer` bean,则 `spring.task.scheduling.pool.size` 将*不再*使用 - 因为 `TaskSchedulingAutoConfiguration` 有一个 `@ConditionalOnMissingBean({ SchedulingConfigurer.类,...` (4认同)
  • 官方文档:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling (3认同)

Leb*_*cca 5

spring-boot 中默认的调度程序池大小只有1

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);
        }
        ...
    }

Run Code Online (Sandbox Code Playgroud)