Skip to content

Async注解

@Async是Spring提供的一个注解,用于声明一个方法应异步执行。这意味着该方法将在单独的线程中运行,不会阻塞主线程的执行。这种方法特别适用于需要长时间运行的任务,如调用外部服务、文件处理或任何可能耗时的操作

默认Executor线程池:

  • 若未定义taskExecutor名称的Bean,尝试依据类型获取Executor类型的bean,否则@Async会回退到SimpleAsyncTaskExecutor,每次调用创建新线程
  • 可通过定义名为taskExecutorThreadPoolTaskExecutor类型的Bean来覆盖默认行为

@Async 注解的方法必须有以下返回类型之一:

  • void
  • Future<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)));
        };
    }