目录
使用场景
@Async
适用于那些不需要立即返回结果的长时间运行的任务,如发送邮件、调用远程服务、进行复杂计算等。
此篇文章看到先别收藏,我有事不小心发出去了才写了三分之一
使用 @Async
要使用 @Async
,你需要做以下几步:
-
启用异步支持:在你的配置类上添加
@EnableAsync
注解。这个注解会告诉 Spring 查找带有@Async
注解的方法,并将其包装到一个代理中,以便将来的方法调用能够在异步任务执行器中执行。
@Configuration
@EnableAsync
public class AsyncConfig {
// 这里可以自定义异步执行器(TaskExecutor)如果需要的话
}
2. 在方法上添加 @Async
注解:你可以在任何 Spring 管理的 bean 的方法上添加 @Async
注解,以使其异步执行。
@Service
public class MyAsyncService {
@Async
public CompletableFuture<String> asyncMethodWithReturnType() {
System.out.println("Execute method asynchronously - "
+ Thread.currentThread().getName());
try {
Thread.sleep(5000);
return CompletableFuture.completedFuture("Hello Async!");
} catch (InterruptedException e) {
return CompletableFuture.completedFuture("Error!");
}
}
}
在上面的示例中,asyncMethodWithReturnType
方法被 @Async
注解修饰。当这个方法被调用时,它将在不同的线程中异步执行。
注意事项
- 返回值:异步方法可以是
void
类型,也可以返回Future
、CompletableFuture
或ListenableFuture
。这允许调用者在适当的时候获取异步操作的结果。 - 异常处理:异步方法中的异常默认不会被调用者捕获。如果方法有返回值,异常会被包装在返回的
Future
中。对于void
返回类型的方法,你可以使用AsyncUncaughtExceptionHandler
来处理未捕获的异常。 - 代理:由于 Spring 使用代理来处理
@Async
注解,因此仅当通过代理调用异步方法时,@Async
才会生效。这意味着在同一个类中的一个方法调用另一个带有@Async
注解的方法,并不会异步执行。 - 自定义执行器:你可以通过实现
AsyncConfigurer
接口并重写getAsyncExecutor
方法来自定义异步执行器(TaskExecutor
)。
使用场景
@Async
适用于那些不需要立即返回结果的长时间运行的任务,如发送邮件、调用远程服务、进行复杂计算等。