前言
在上下文中没有Executor
bean的情况下,Spring Boot 会使用合理的默认值自动配置一个 ThreadPoolTaskExecutor
,这些默认值可以自动关联到 异步任务执行( @EnableAsync
)和 Spring MVC 异步请求处理。
如果您在上下文中定义了一个自定义
Executor
,则常规任务执行(即@EnableAsync
)将透明地使用它,但由于需要AsyncTaskExecutor
实现(名为applicationTaskExecutor
),因此不会配置 Spring MVC 支持。根据你的目标安排,你可以改变Executor
为ThreadPoolTaskExecutor
或同时定义ThreadPoolTaskExecutor
和AsyncConfigurer
包装您的自定义Executor
通过自动配置的
TaskExecutorBuilder
,您可以轻松创建实例,以重现默认情况下自动配置的功能。
线程池使用 8 个核心线程,这些线程可以根据负载增长和收缩。可以使用 spring.task.execution
名称空间对这些默认设置进行微调,如以下示例所示:
spring.task.execution.pool.max-size=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s
这会将线程池更改为使用有界队列,以便在队列已满(100 个任务)时,线程池最多增加到 16 个线程。池的收缩更加激进,因为当线程空闲 10 秒(而不是默认情况下的 60 秒)时,它们将被回收。
如果需要与计划的任务执行( @EnableScheduling
)关联,也可以自动配置 ThreadPoolTaskScheduler
。线程池默认使用一个线程,可以使用 spring.task.scheduling
名称空间对这些设置进行微调。
spring.task.scheduling.thread-name-prefix=scheduling-
spring.task.scheduling.pool.size=2
如果要创建自定义的执行器或调度器,上下文提供了 TaskExecutorBuilder
bean 和 TaskSchedulerBuilder
bean。
参考源码:
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration