在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
spring boot中@async异步调用本质依赖线程池,默认使用无复用能力的simpleasynctaskexecutor,生产环境必须自定义threadpooltaskexecutor;需添加@enableasync启用,通过@bean定义taskexecutor并合理设置coresize、maxsize、queuecapacity及拒绝策略,且@async方法须为public、跨bean调用才生效。

在 Spring Boot 中使用 @Async 实现异步调用,本质是让方法在独立线程中执行,而底层依赖的是 Spring 管理的线程池。默认情况下 Spring 会创建一个简单的 SimpleAsyncTaskExecutor(非真正的线程池),但生产环境必须自定义线程池,否则容易耗尽资源或出现不可控行为。
启用 @Async 支持
在启动类或配置类上添加 @EnableAsync 注解,这是开启异步能力的前提:
// 启动类上加这个
@SpringBootApplication<br>
@EnableAsync<br>
public class Application {<br>
public static void main(String[] args) {<br>
SpringApplication.run(Application.class, args);<br>
}<br>
}
定义自定义线程池 Bean
Spring 会自动查找名为 taskExecutor 的 ThreadPoolTaskExecutor Bean;若想用其他名字,需配合 @Async("yourExecutorName") 显式指定。
推荐配置方式(Java Config):
- 核心线程数设为 CPU 核心数 + 1(适合 I/O 密集型任务)
- 最大线程数根据并发峰值预估,避免无限增长
- 队列容量不宜过大,防止任务积压掩盖性能瓶颈
- 设置拒绝策略,比如
CallerRunsPolicy让调用方自己执行(降级保障)
@Configuration<br>
public class AsyncConfig {<br>
@Bean("taskExecutor")<br>
public ThreadPoolTaskExecutor taskExecutor() {<br>
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();<br>
executor.setCorePoolSize(4);<br>
executor.setMaxPoolSize(20);<br>
executor.setQueueCapacity(100);<br>
executor.setThreadNamePrefix("async-");<br>
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());<br>
executor.initialize();<br>
return executor;<br>
}<br>
}
@Async 方法的使用限制
@Async 只对 public 方法生效,且不能在同一个类内部调用(因为代理机制失效)。常见写法:
- 把异步方法抽到另一个
@Service类中 - 确保调用方和被调用方是不同 Bean 实例(Spring AOP 代理才起作用)
- 方法返回值可以是
void或Future<t></t>,后者支持获取结果和异常
@Service<br>
public class EmailService {<br>
@Async // 使用默认 taskExecutor<br>
public void sendEmail(String to) {<br>
// 发送邮件逻辑<br>
}<br><br>
@Async("taskExecutor")<br>
public Future<boolean> sendSms(String phone) throws InterruptedException {<br>
Thread.sleep(1000);<br>
return new AsyncResult(true);<br>
}<br>
}</boolean>
异常处理与日志跟踪
异步方法抛出的异常不会传播给调用方,需主动捕获或配置全局异常处理器:
- 在
@Async方法内 try-catch 处理业务异常 - 实现
AsyncUncaughtExceptionHandler捕获未处理异常 - 结合 MDC(如 Logback)传递请求 ID,便于日志关联
例如:
@Configuration<br>
public class AsyncExceptionConfig implements AsyncConfigurer {<br>
@Override<br>
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {<br>
return (ex, method, params) -> {<br>
log.error("Async method {} threw exception", method, ex);<br>
};<br>
}<br>
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










