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

9 浏览
0 Comments

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

我正在使用spring-boot@Scheduled注解来执行一些任务。\n如何在spring-boot中找到默认的计划任务池大小是多少?\n原因:下面的类不会并行执行任务,而是一个接着一个执行。也许默认只配置了一个单线程执行器?\n

@Service
public class ZipFileTesterAsync {
    @Scheduled(fixedDelay = 60000, initialDelay = 500)
    public void run() throws Exception {
        System.out.println("导入1");
        TimeUnit.MINUTES.sleep(1);
        System.out.println("导入1完成");
    }
    @Scheduled(fixedDelay = 60000, initialDelay = 1000)
    public void run2() throws Exception {
        System.out.println("导入2");
        TimeUnit.MINUTES.sleep(1);
    }
}

\n结果:第二个任务在第一个任务完成后执行。

0
0 Comments

默认的spring-boot调度程序池大小只有1个。在ScheduledTaskRegistrar类中的scheduleTasks方法中,如果没有指定任务调度程序,则会创建一个单线程的调度程序,并将其设置为ConcurrentTaskScheduler。

解决方法:

要更改默认的调度程序池大小,可以通过在应用程序的配置文件中添加以下属性来实现:

spring.task.scheduling.pool.size=10

这将将调度程序池大小设置为10,以允许并发执行多个任务。

0
0 Comments

默认的调度器池大小为1,但是在springboot2.1.0及以后的版本中,可以通过更改application.properties中的spring.task.scheduling.pool.size的值来设置池大小。

当触发周期短于执行持续时间时,相同的任务将按序执行。Spring Boot将使用最多20个线程并行执行不同的任务。

一开始我在查找有关这个属性的文档时遇到了困难,所以这里提供一个链接给其他想要确认这一点的人:[docs4dev.com/docs/en/spring-boot/2.1.1.RELEASE/reference/boot-features-task-execution-scheduling.html](https://www.docs4dev.com/docs/en/spring-boot/2.1.1.RELEASE/reference/boot-features-task-execution-scheduling.html)

官方文档:[docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.task-execution-and-scheduling)

这个解决方法更加优雅,因为我们可以在不重新部署应用程序的情况下更改配置。

请注意,如果您或您的任何依赖定义了一个SchedulingConfigurer bean,spring.task.scheduling.pool.size将不再被使用,因为TaskSchedulingAutoConfiguration有一个({ SchedulingConfigurer.class, ...

0
0 Comments

是的,默认情况下,所有的`@Scheduled`方法共享一个线程。

可以通过定义一个`SchedulingConfigurer`来覆盖这个行为,如下所示:

public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(100);
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
}

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

是否可以为不同的注解设置不同的线程池?

可以创建不同的`ThreadPoolTaskScheduler`并使用`threadPoolTaskScheduler.schedule`方法。

不行,据我所知不可以。`ScheduledAnnotationBeanPostProcessor`始终使用默认的任务调度器(可以查看代码)。要能够将任务调度到不同的线程池,只需使用内置的Java`java.util.concurrent.Executors`创建另一个线程池。

这种方法会创建100个线程,即使前面的线程已经停止了,有没有办法设置一个更高的最大线程数,但保持较低的运行线程数?

0