Spring Boot 自动配置之 TaskExecutor - 实践

news/2025/10/23 21:09:00/文章来源:https://www.cnblogs.com/tlnshuju/p/19161640

Spring Boot 自动配置之 TaskExecutor - 实践

2025-10-23 21:05  tlnshuju  阅读(0)  评论(0)    收藏  举报

 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 异步执行结果的Future对象,包含返回字符串"Hello, World!"*/@Asyncpublic Future 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 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.mzph.cn/news/944675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二分图/忆re.

rt: 本文分两部分二分图 忆re.part 1 二分图 定义 我会告诉你我OIwiki没看懂吗? 其实就是有一张图,将它的点分为红点和蓝点,红点只能和蓝点相连,同理蓝点只能和红点相连,满足这个条件的图就是二分图。 形式上的…

编程与数学 03-009 Linux 操作系统应用 22_Linux 故障排除与问题克服

编程与数学 03-009 Linux 操作系统应用 22_Linux 故障排除与问题克服pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

《IDEA 2025长效采用配置指南:有效期配置至2099年实战之JetBrains全家桶有效》​

《IDEA 2025长效采用配置指南:有效期配置至2099年实战之JetBrains全家桶有效》​pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

如何制作PDF文件目录? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

todesk远程到被控Mac后能看到画面,鼠标键盘执行无反应

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Visual Studio 插件 - 喝水提醒 - 指南

Visual Studio 插件 - 喝水提醒 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

10/23

状态图状态图通常是对反应型对象建模 活动图 活动图展示的是流程*构件图构件图有标志 构件图展示的是构件之间的 组织和依赖供接口和需接口 部署图--对物理方面建模的方法 部署图对实施方面进行建模 立方体需求建模、…

玛哈特十一辊矫平机:把金属板送进“11 次节拍器” - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JAVA 排序用法

目录背景和价值一、 Comparator 的基本用法二、 Java 8 之前(匿名内部类)三、 Java 8 之后(Lambda 表达式和方法引用)1. 使用 Lambda 表达式2. 使用静态工厂方法 Comparator.comparing()(推荐)3. 链式比较(多条…

esp32-usb-jtag 调试踩坑

背景 ESP 芯片通常使用 UART 实现串口,并可以通过外部 USB-UART 桥接芯片,连接到主机/PC 上的串口控制台仿真器。然而,在具有 USB 串行/JTAG 控制器的 ESP 芯片上,控制器的 CDC-ACM 部分即可实现串口,该串口直接连…

MySQLDay3

3.约束 3.1、概述概念:约束时作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类:注意:约束时作用于表中字段上的,可以在创建表/修改表的时候添加约束。 案例…

第3天(中等题+简单题 数组、滑动窗口)

打卡第三天 1道简单题+2道中等题定长滑动窗口套路:今日耗时≈一小时 明天继续

飞牛OS通过docker部署SillyTavern酒馆

一、下载在飞牛 Docker -> 镜像仓库 中搜索 SillyTavern 下载镜像。镜像仓库中没有官方的 SillyTavern 镜像,下载有最多下载数的镜像即可,我使用 goolashe/sillytavern:stable 。前往 GitHub - SillyTavern/Silly…

完整教程:微信小程序学习(一)

完整教程:微信小程序学习(一)2025-10-23 20:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级

ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

深入解析:XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>

深入解析:XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

MySQL主从同步读写分离

[!NOTE] 准备三台机器: 两台用于主从同步,一台读写分离。 环境初始化:关防火墙一、主从同步实验主机从机安装数据库 # 安装 wget下载工具yum -y install wget # 下载 mysql 官方 yum 源安装包wget https://repo.mys…

AI股票预测分析报告 - 2025年10月23日 20:26

AI股票预测分析报告 - 2025年10月23日 20:26body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

nginx反向代理测试搭建

一、nginx反向代理模拟搭建[!IMPORTANT] 步骤: 1.准备三台服务器,一台装nginx,配置两个网卡,一个有网一个无网;两台装jdk和tomecat,无网(仅主机模式) 2.两台被访问的服务器,进入tomcat中的webapps中,删除所有文…