当前位置: 首页 > news >正文

Spring Boot 自动配置之 TaskExecutor

 TaskExecutor 是什么?

Spring 的 TaskExecutor 本质上是对 Java Executor 的抽象封装,用来异步执行任务,把任务提交到线程池里运行,而不是阻塞当前线程。

主要作用:解耦任务提交与执行,提升并发能力和系统吞吐量。

常见场景:

  • 异步方法执行(配合 @Async 使用)。
  • 并发处理耗时任务(如批量数据处理、文件上传、消息发送)。
  • 后台任务执行(日志写入、通知推送、邮件发送)。

一句话理解:TaskExecutor 就是 Spring 提供的“线程池接口”,常用于异步化和并发任务处理。

Spring Boot 自动配置类

所在包:org.springframework.boot.autoconfigure.task

类名:TaskExecutionAutoConfiguration

@ConditionalOnClass(ThreadPoolTaskExecutor.class)
@AutoConfiguration
@EnableConfigurationProperties(TaskExecutionProperties.class)
@Import({ TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration.class,TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration.class,TaskExecutorConfigurations.TaskExecutorConfiguration.class,TaskExecutorConfigurations.BootstrapExecutorConfiguration.class })
public class TaskExecutionAutoConfiguration {/*** Bean name of the application {@link TaskExecutor}.*/public static final String APPLICATION_TASK_EXECUTOR_BEAN_NAME = "applicationTaskExecutor";}

具体的自动配置类是由 TaskExecutorConfiguration 类来完成的。TaskExecutor 被自动配置后生成的 Bean 的名称是 “applicationTaskExecutor”

通过 @EnableAsync 注解来启用 @Async 注解

注解:@EnableAsync

@Service
@EnableAsync
public class DemoService {}

@EnableAsync 注解,可以在 @Component 、@Service、@Configuration 标注的类上使用。

使用自动配置的 TaskExecutor

具体的自动配置的类:org.springframework.boot.autoconfigure.task.TaskExecutorConfiguration

自动配置的 bean 代码如下:

	@Configuration(proxyBeanMethods = false)@Conditional(OnExecutorCondition.class)@Import(AsyncConfigurerConfiguration.class)static class TaskExecutorConfiguration {@Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)@ConditionalOnThreading(Threading.VIRTUAL)SimpleAsyncTaskExecutor applicationTaskExecutorVirtualThreads(SimpleAsyncTaskExecutorBuilder builder) {return builder.build();}@Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)@Lazy@ConditionalOnThreading(Threading.PLATFORM)ThreadPoolTaskExecutor applicationTaskExecutor(ThreadPoolTaskExecutorBuilder threadPoolTaskExecutorBuilder) {return threadPoolTaskExecutorBuilder.build();}}

从以上代码可以看出自动配置的 Bean 的名称是 “applicationTaskExecutor” , 具体类型因使用的线程类型而不同。

package com.example.demo.service;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;@Service
@EnableAsync
public class DemoService {/*** 异步执行的任务方法,无返回值* 该方法会在后台线程中执行,模拟耗时操作(休眠10秒)* 使用@Async注解标记为异步方法*/@Asyncpublic void asyncTask() {try {// 模拟耗时操作,线程休眠10秒Thread.sleep(10000);} catch (InterruptedException e) {// 恢复中断状态,保持线程的中断标志Thread.currentThread().interrupt();}}/*** 异步执行的任务方法,带有返回值* 该方法会在后台线程中执行,模拟耗时操作(休眠10秒),然后返回结果* 使用@Async注解标记为异步方法** @return Future<String> 异步执行结果的Future对象,包含返回字符串"Hello, World!"*/@Asyncpublic Future<String> asyncTaskWithReturnValue() {try {// 模拟耗时操作,线程休眠10秒Thread.sleep(10000);} catch (InterruptedException e) {// 恢复中断状态,保持线程的中断标志Thread.currentThread().interrupt();}// 返回异步执行结果return CompletableFuture.completedFuture("Hello, World!");}}
    @Autowiredprivate TaskExecutor applicationTaskExecutor;@RequestMapping("/task")public Response task() {applicationTaskExecutor.execute(() -> {System.out.println("task execute");});return Response.buildSuccess();}@RequestMapping("/asyncTask")public Response demo() throws ExecutionException, InterruptedException {Future<String> stringFuture = demoService.asyncTaskWithReturnValue();String s = stringFuture.get();return SingleResponse.of(s);}

使用 Spring Boot 自动配置的 TaskExecutor,通常有两种方式:

1、通过 @Autowired 注入 Bean;

2、使用  @Async 注解,注意:此注解必须用在 非 @Configuration 标注的类里面的方法上。

TaskExecutor 使用的线程池默认配置

TaskExecutor 背后使用的线程池为 ThreadPoolTaskExecutor,默认参数如下:

  1.  corePoolSize 核心线程数为 8
  2. 如果指定的队列长度 > 0 则使用 LinkedBlockingQueue (有界阻塞队列),否则为 SynchronousQueue(同步队列);
  3. queueCapacity 队列长度默认为 Integer.MAX_VALUE,无界的;
  4. maxPoolSize 最大线程数默认为 Integer.MAX_VALUE;
  5. allowCoreThreadTimeOut 默认为 true,这意味着运行核心线程被回收;
  6. keepAlive 空闲时间默认为 1 分钟;
  7. awaitTermination ,默认 false;
  8. threadNamePrefix,线程名称前缀,默认 “task-”。

以上默认配置如果直接在生产上使用是有很大风险的,比如:内存溢出,部分参数默认值是不合理的,比如:queueCapacity 、maxPoolSize、allowCoreThreadTimeOut ,可以通过 application.yml 配置文件来更改这些默认配置,比如:

spring:task:execution:pool:core-size: 5          # 核心线程数max-size: 10          # 最大线程数queue-capacity: 100   # 队列容量keep-alive: 60s       # 非核心线程存活时间thread-name-prefix: async-exec-   # 线程名前缀shutdown:await-termination: true         # 应用关闭时是否等待任务完成await-termination-period: 30s   # 最长等待时间

或通过实现 ThreadPoolTaskExecutorCustomizer 接口来自定义配置参数,

import org.springframework.boot.task.ThreadPoolTaskExecutorCustomizer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;@Component
public class TaskExecutorCustomizer implements ThreadPoolTaskExecutorCustomizer {@Overridepublic void customize(ThreadPoolTaskExecutor taskExecutor) {taskExecutor.setCorePoolSize(5);taskExecutor.setMaxPoolSize(10);taskExecutor.setQueueCapacity(100);taskExecutor.setKeepAliveSeconds(60);taskExecutor.setThreadNamePrefix("async-exec-");taskExecutor.setWaitForTasksToCompleteOnShutdown(true);taskExecutor.setAwaitTerminationSeconds(30);}}

注:Spring Boot 版本为 3.5.5

http://www.dtcms.com/a/412448.html

相关文章:

  • 重庆网站制作有名 乐云践新自己电脑做网站服务器系统
  • AES加密/解密算法
  • 用网站做微信公众号台州做网站seo
  • 如何让网站互动起来ts431p 做网站
  • 土石方工程网站系统开发流程8个步骤
  • MRIcron画大脑叠加图
  • 自己做的网站能放到网上么开发网站用php还是jsp
  • 如何自己建个网站中国建筑公司排名最新五十强
  • ps可以做网站动态图做网站欢迎页什么意思
  • 用drupal做的网站百度权重高的网站
  • 长春 万网 网站建设哈尔滨免费模板建站
  • 织梦网站地图在线生成网建会是什么意思
  • 做hmtl的基本网站调用wordpress媒体库
  • RAG技术全面指南:解锁大模型应用的未来
  • AppGallery Connect(HarmonyOS 5及以上) --公开测试创建并发布测试版本(一)
  • 网站研发费用吗WordPress新版文章标签
  • 网站公司动态做不了怎么办做网站月度总结
  • 网站页面小图标怎么做wordpress点赞功能
  • 湖南(源点咨询)市场调研如何在行业研究中快速有效介入 补充篇
  • 开学季“心”准备|心理普测怎么做?朗心心理信息化管理平台筑牢校园心理安全防线
  • 广东泰通建设有限公司网站东莞seo建站广告费
  • 医药医疗行业网站建设去水印小程序源码
  • # 打工人日报#20250926
  • MODBUS 协议详细解读
  • Unity避坑——继承了MonoBehaviour的对象不能通过new来创建
  • 网站和网页wordpress修改邮件模板
  • 必应网站建设开源企业网站源码
  • 官方网站的资料做证据百度seo优化招聘
  • VSCode+MSVC+Qmake环境搭建笔记
  • 公司做网站选择哪个公司好数据库网站建设教程