Spring Boot 中的异步调用
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());@Asyncpublic 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 {@Beanpublic 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);
Spring Boot 中的异步调用相关推荐
- Spring Boot 中启用异步调用
在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行. 在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可 ...
- 调用别的方法的返回值_Spring boot如何实现异步调用
Spring boot如何实现异步调用 异步调用:一个可以无需等待被调用函数的返回值就让操作继续进行的方法 举个例子 异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的 ...
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...
- Spring Boot中使用@Async实现异步调用
什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...
- springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门
[小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...
- 在controller中调用指定参数给指定表单_第005课:Spring Boot 中MVC支持
Spring Boot 的 MVC 支持主要介绍实际项目中最常用的几个注解,包括 @RestController. @RequestMapping.@PathVariable.@RequestPara ...
- java调用r实例,Spring Boot中使用RSocket的示例代码
1. 概述 RSocket 应用层协议支持Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket 用在spring boot ...
- 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)
上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...
- java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题
SSM中 Spring MVC配置 传统的web.xml配置 web.xml contextConfigLocation classpath*:applicationContext.xml org.s ...
最新文章
- 【opencv】(7) 图像匹配、直方图、图像均衡化
- 【转】利用WCF的双工通信
- 【Android 应用开发】Android应用的自动更新模块
- nyoj496巡回赛-拓扑排序-拓扑序列
- 保持学习,从这几个公众号开始!
- 程序员面试金典 - 面试题 04.05. 合法二叉搜索树(中序遍历)
- Vue版todolist案例
- Android 系统(225)---Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转
- php去掉 x5E,清除wordpress里PHP文件恶意代码
- Qt4_实现自定义委托
- 计算机复试考研专业课,2018计算机考研专业课复试复习攻略
- vue-cli3.x正确打包项目,解决静态资源与路由加载无效的问题,history模式下配合使用nginx运行打包后的项目
- DoG(Difference of Gaussian)
- DIV下的DIV居中
- 图书馆系统java实训报告_基于Java的图书馆管理系统的设计实习报告
- js+java实现登录滑动图片验证功能
- 【C语言】算法学习·哈希算法全解
- Android monkey 压力测试
- 磁力聚合搜索工具中文版magnetW 3.1.1
- 模拟器怎么安装xposed框架
热门文章
- 一阶和二阶电路的时域分析
- Chrome(谷歌)浏览器永久关闭恢复页面提示框
- Arduino UNO+L298驱动直流电机正反转+Proteus仿真
- Day25 打卡第二十五天
- arm11处理器架构详细分析
- ls一1测距仪说明书_杜克 LS-P激光测距仪开箱及上手体验
- 进口红外热像仪Fluke TI480 PRO ,FLUKE TI401RPO怎么样
- 无线网络连接不上请检查服务器,网络连接中断,请检查上行连路连接或联系ISP解决在手机上出现怎么办?而且家里的网刚修过换了新的。...
- 对学校的希望和寄语_家长对孩子的希望和寄语
- 拥有用于游戏的独立服务器的好处