Spring Boot 中的异步调用[通俗易懂]
2023-06-13 09:12:11 时间
大家好,又见面了,我是你们的朋友全栈君。
Spring Boot 中的异步调用
通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行。而异步编程则没有这个限制,代码的调用不再是阻塞的。所以在一些情景下,通过异步编程可以提高效率,提升接口的吞吐量。这节将介绍如何在Spring Boot中进行异步编程。
要开启异步支持,首先得在Spring Boot入口类上加上@EnableAsync注解:
@SpringBootApplication
@EnableAsync
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
新建service包,并创建TestService:
@Service
public class TestService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Async
public void asyncMethod() {
sleep();
logger.info("异步方法内部线程名称:{}", Thread.currentThread().getName());
}
public void syncMethod() {
sleep();
}
private void sleep() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面的Service中包含一个异步方法asyncMethod(开启异步支持后,只需要在方法上加上@Async注解便是异步方法了)和同步方法syncMethod。sleep方法用于让当前线程阻塞2秒钟。
因为异步的原因,程序并没有被sleep方法阻塞,这就是异步调用的好处。同时异步方法内部会新启一个线程来执行
默认情况下的异步线程池配置使得线程不能被重用,每次调用异步方法都会新建一个线程,我们可以自己定义异步线程池来优化。
@Configuration
public class AsyncPoolConfig {
@Bean
public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(200);
executor.setQueueCapacity(25);
executor.setKeepAliveSeconds(200);
executor.setThreadNamePrefix("asyncThread");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
要使用该线程池,只需要在@Async注解上指定线程池Bean名称即可:
@Service
public class TestService {
......
@Async("asyncThreadPoolTaskExecutor")
public void asyncMethod() {
......
}
......
}
处理异步回调
如果异步方法具有返回值的话,需要使用Future来接收回调值。我们修改TestService的asyncMethod方法,给其添加返回值:
@Async("asyncThreadPoolTaskExecutor")
public Future<String> asyncMethod() {
sleep();
logger.info("异步方法内部线程名称:{}", Thread.currentThread().getName());
return new AsyncResult<>("hello async");
}
Future接口的get方法用于获取异步调用的返回值。
通过返回结果我们可以看出Future的get方法为阻塞方法,只有当异步方法返回内容了,程序才会继续往下执行。get还有一个get(long timeout, TimeUnit unit)重载方法,我们可以通过这个重载方法设置超时时间,即异步方法在设定时间内没有返回值的话,直接抛出java.util.concurrent.TimeoutException异常。
比如设置超时时间为60秒:
String result = stringFuture.get(60, TimeUnit.SECONDS);
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157342.html原文链接:https://javaforall.cn
相关文章
- Spring MVC框架:第四章:属性域使用(request域、session域、application域)
- Spring MVC各组件近距离接触--下下--05
- Spring Boot + Web Socket 打造实时监控异常,写得太好了!
- Spring Boot 一个接口同时支持 form 表单、form-data、json 的优雅写法
- Java POI 导出Excel经典实现 导出Excel弹出下载框 Spring Boot【不定期更新】
- 使用Maven创建Spring Boot应用及运行
- Spring Boot拦截器配置拦截登陆「建议收藏」
- Spring 5(一)概述
- spring boot 接口_什么是API接口
- spring boot项目读取配置文件的参数
- Spring Boot、Spring Cloud 自定义配置文件(如何整合配置中心)
- 学习Spring Boot前送你3个锦囊
- 将Bean交给Spring容器管理有几种方式?
- 【Spring boot Nacos系列教程】Nacos第三篇:多环境配置
- Spring基础(二):IOC概念引入
- 公司用了 6 年的Spring Boot 部署方案!打包 + Shell 脚本详解,稳的一批!
- Spring Boot的安全配置(三)
- Spring Boot的加密和解密(一)
- Spring Boot的监控
- Spring Cloud Security使用Spring Cloud Config集中管理安全配置
- Linux启动与停止spring boot工程的脚本示例
- 使用spring boot和thrift、zookeeper建立微服务详解架构师
- spring cloud教程之使用spring boot创建一个应用详解编程语言
- SpringBoot之外部Tomcat运行Spring Boot项目详解编程语言
- Spring Boot Runner启动器详解编程语言
- spring Boot(十九):使用Spring Boot Actuator监控应用详解编程语言
- Spring Boot(十八):使用Spring Boot集成FastDFS详解编程语言
- Spring Boot 2.x :通过 spring-boot-starter-hbase 集成 HBase