Async注解
@Async是Spring提供的一个注解,用于声明一个方法应异步执行。这意味着该方法将在单独的线程中运行,不会阻塞主线程的执行。这种方法特别适用于需要长时间运行的任务,如调用外部服务、文件处理或任何可能耗时的操作默认Executor线程池:
- 若未定义
taskExecutor名称的Bean,尝试依据类型获取Executor类型的bean,否则@Async会回退到SimpleAsyncTaskExecutor,每次调用创建新线程- 可通过定义名为
taskExecutor的ThreadPoolTaskExecutor类型的Bean来覆盖默认行为
@Async 注解的方法必须有以下返回类型之一:
voidFuture<T>ListenableFuture<T>CompletableFuture<T>
基本使用
value:指定要使用的自定义Executor类型的bean的名称
java
/**
* 指定Async注解使用的线程池
*/
@Override
public Executor getAsyncExecutor() {
return SpringUtils.getBean("threadPoolTaskExecutor");
}
private static final Logger logger = LoggerFactory.getLogger("sys-async");
/**
* 异步线程池抛出异常时的处理逻辑
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (Throwable ex, Method method, Object... params)-> {
// 异步方法异常处理
logger.error(String.format("class#method#params: %s#%s#%s\nCaused: %s", method.getDeclaringClass().getName(), method.getName(), Arrays.toString(params), ExceptionUtil.getExceptionMessage(ex)));
};
}