spring @Async

讨论一下 spring  boot 下 使用 spring 异步执行的注解

先看下这个类:

 这个类是 spring boot auto configure 下完成 TaskExecutor的自动配置。

1. 需要在类路径存在 ThreadPoolTaskExecutor,这个类是 是spring context模块下的类,也就是 需要引入 spring context 依赖,这个基本都会引入

2. 标识为配置类

3. taskExecution的属性配置

如果不存在TaskExecutorBuilder类型的bean,这在这里注册默认的TaskExecutorBuilder。

默认的线程池:

1. 队列大小: 最大

2. 核心线程数: 8

3. 最大线程数:8

4. 

如果不存在 Executor类型的bean,这使用builder构建一个。

这个Executor 是 jdk中的线程池的顶级父类,也就是 如果 容器中存在这个线程池bean,就不构建了。

如果不想使用默认的,可以自己定义:

 ThreadPoolTaskExecutor 内部构建的就是 JDK提供的 ThreadPoolExecutor

此时,不论是 用默认的 还是 自定义的,线程容器中已经存在了 一个 线程池。

当 使用 @Async 注解类 描述一个方法时,发生了什么?

不出意外的话,这里应该是 使用的 AOP实现的。

@EnableAsync注解 使用 importSelector注册。

 

这里默认的 模式 是PROXY

注册一个 bean的名称为 org.springframework.context.annotation.internalAsyncAnnotationProcessor

类型为:AsyncAnnotationBeanPostProcessor

 

这里获取 @Async 指定的 处理器,如果没指定就用默认的。

 一般都是 直接提交任务。

到这里 基本OK。

注意两点:

1. @EnableAsync 开启异步能力

2. 适当自定义线程池

处理 使用 @Bean,这种方式也可以,不过 这个在调用的时候才创建

### 关于 `@Async` 注解的使用和配置 #### 配置异步方法支持 为了使应用程序能够执行异步调用,在配置类上启用异步处理功能是必要的。这可以通过添加 `@EnableAsync` 来实现,该注释允许 Spring 容器管理异步操作。 ```java @Configuration @EnableAsync public class AsyncConfig { } ``` 当启用了异步特性之后,任何带有 `@Async` 的公共方法都会被识别为潜在的异步候选者[^2]。 #### 使用 `@Async` 注解的方法签名 要定义一个可以异步执行的方法,只需简单地在其声明前加上 `@Async` 即可: ```java @Service public class AsyncTaskService { @Async public CompletableFuture<String> asyncMethodWithReturnType() throws InterruptedException { // Simulate long-running task... Thread.sleep(5000); return CompletableFuture.completedFuture("hello world"); } } ``` 注意这里返回的是 `CompletableFuture<T>` 类型的结果对象,它提供了更灵活的方式来处理完成后的回调逻辑以及组合多个异步计算的能力[^1]。 对于那些不需要关心其结果的操作,则可以直接让这些函数不带返回值(即 void),如下所示: ```java @Async public void asyncMethodWithoutReturn() throws InterruptedException { // Perform some actions asynchronously. } ``` 如果希望捕获异常并对其进行自定义处理的话,还可以通过实现 `AsyncUncaughtExceptionHandler` 接口来达到目的。 #### 处理事务传播行为 默认情况下,由 `@Transactional` 和 `@Async` 同时修饰的方法可能会遇到一些意想不到的行为,因为它们分别控制着不同的上下文生命周期。通常建议将两者分开应用于不同层次的服务层中以避免复杂度增加带来的风险[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值