本文主要是介绍【日常记录-Java】SpringBoot中使用无返回值的异步方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Author:赵志乾
Date:2024-09-05
Declaration:All Right Reserved!!!
1. 简介
在SpringBoot中,使用@Async注解可以很方便地标记一个方法为异步执行。好处是调用者无需等待这些方法完成便可继续执行其他任务,从而提高应用程序的响应性和吞吐量。
2. 步骤
2.1 启用异步支持
在配置类上添加@EnableAsync注解来启用异步支持。代码如下:
@Configuration
@EnableAsync
public class AsyncConfig { }
2.2 配置线程池
SpringBoot默认使用SimpleAsyncTaskExecutor来执行异步任务,其每次会创建一个新的线程来执行任务,从而导致大量线程被创建,效率低下。为此,可通过配置一个自定义线程池来执行@Async方法。代码如下:
@Configuration
@EnableAsync
public class AsyncConfig { @Beanpublic ThreadPoolTaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(10);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initialize();return executor;}
}
2.3 @Async注解标注异步方法
异步方法需要Spring的管理,故其必须在Bean内定义。代码如下:
@Service
public class AsyncService { @Async public void executeAsyncTask() { try { Thread.sleep(5000); // 假设这个任务需要5秒钟来完成 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("异步任务执行完成"); }
}
2.4 异步方法调用
异步方法在另一个Bean内调用,可直接使用。代码如下:
@Service
public class CustomService{@Resourceprivate AsyncService asyncService;public void execute(){// 自定义逻辑// 异步调用asyncService.executeAsyncTask();// 自定义逻辑}
}
注意:异步方法调用不要在同一Bean内进行,即异步方法和调用异步方法的方法位于同一Bean内,此时将无法使用代理完成异步操作。即使通过AopContext获取代理方式进行调用,也会产生如下错误:
ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context
这篇关于【日常记录-Java】SpringBoot中使用无返回值的异步方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!