目录
什么是AsynConfigurer
为什么需要AsynConfigurer
怎么配置AsynConfigurer
注意事项
统一异常捕获
其他相关类
AsyncExecutionInterceptor
AsyncExecutionAspectSupport
参考资料
什么是AsynConfigurer
AsynConfigurer的与@Async注解密不可分,在这里我们先说一下什么是@Async。@Async注解的就是通过AsyncAnnotationBeanPostProcessor这个后置处理器生成一个代理对象来实现异步的。
为什么需要AsynConfigurer
Spring可以通过@EnableAsync和@Async两个注解实现异步操作。启动类加上: @EnableAsync注解,同时并且在service上加上@Async注解。但是@Async用的是SimpleAsyncTaskExecutor线程池,如果没有对SimpleAsyncTaskExecutor做策略配置的话,是不复用线程的,也是对服务器资源的极大浪费。所以我们需要AsynConfigurer来配置异步线程池。
public interface AsyncConfigurer {
Executor getAsyncExecutor();
AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler();
}
怎么配置AsynConfigurer
配置的话很简单,只要继承一下AsynConfigurerSupport类就可以了。这里AsynConfigurer和AsynConfigurerSupport都可以
@Configuration
@EnableAsync(proxyTargetClass = true)
@Slf4j
public class AsyncConfig implements AsyncConfigurer {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) ->
log.error("Unexpected error occurred invoking async method: " + method +
", args: " + Arrays.toString(params), ex);
}
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("MyExecutor-");
executor.setWaitForTasksToCompleteonShutdown(false);
// 设置拒绝策略
executor.setRejectedExecutionHandler((r, e) -> {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
});
executor.initialize();
return executor;
}
注意事项
统一异常捕获
@Async的注解是另外启一个线程去执行方法,无法被@RestControllerAdvice该注解获取异常,异常处理需要自己手动处理。
其他相关类
AsyncExecutionInterceptor
AsyncExecutionAspectSupport
AsyncExecutionAspectSupport
参考资料
聊聊spring的async注解 - 简书
Spring中异步注解@Async的使用、原理及使用时可能导致的问题



