41、任务执行与调度

在上下文中没有 Executor bean 的情况下,Spring Boot 会自动配置一个有合理默认值的 ThreadPoolTask​​Executor,它可以自动与异步任务执行(@EnableAsync)和 Spring MVC 异步请求处理相关联。

提示

如果您在上下文中定义了自定义 Executor,则常规任务执行(即 @EnableAsync)将透明地使用它,但不会配置 Spring MVC 支持,因为它需要 AsyncTaskExecutor 实现(名为 applicationTaskExecutor)。根据您的目标安排,您可以将 Executor 更改为 ThreadPoolTask​​Executor,或者定义 Executor的ThreadPoolTask​​ExecutorAsyncConfigurer 来包装自定义的 Executor。您可以使用自动配置的 TaskExecutorBuilder 来轻松创建实例,以复制默认的自动配置。

线程池使用 8 个核心线程,可根据负载情况增加和减少。可以使用 spring.task.execution 命名空间对这些默认设置进行微调,如下所示:

  1. spring.task.execution.pool.max-threads=16
  2. spring.task.execution.pool.queue-capacity=100
  3. spring.task.execution.pool.keep-alive=10s

这会将线程池更改为使用有界队列,在队列满(100 个任务)时,线程池将增加到最多 16 个线程。当线程在闲置10 秒(而不是默认的 60 秒)时回收线程,池的收缩更为明显。

如果需要与调度任务执行(@EnableScheduling)相关联,可以自动配置一个 ThreadPoolTaskScheduler。默认情况下,线程池使用一个线程,可以使用 spring.task.scheduling 命名空间对这些设置进行微调。

如果需要创建自定义执行器或调度器,则在上下文中可以使用 TaskExecutorBuilder bean 和 TaskSchedulerBuilder bean。