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 中的异步调用相关推荐

  1. Spring Boot 中启用异步调用

    在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行. 在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可 ...

  2. 调用别的方法的返回值_Spring boot如何实现异步调用

    Spring boot如何实现异步调用 异步调用:一个可以无需等待被调用函数的返回值就让操作继续进行的方法 举个例子 异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的 ...

  3. Spring Boot 中使用@Async实现异步调用,加速任务执行!

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...

  4. Spring Boot中使用@Async实现异步调用

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...

  5. springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

    [小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...

  6. 在controller中调用指定参数给指定表单_第005课:Spring Boot 中MVC支持

    Spring Boot 的 MVC 支持主要介绍实际项目中最常用的几个注解,包括 @RestController. @RequestMapping.@PathVariable.@RequestPara ...

  7. java调用r实例,Spring Boot中使用RSocket的示例代码

    1. 概述 RSocket 应用层协议支持Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket 用在spring boot ...

  8. 在Spring Boot中实现相关ID(用于SOA /微服务中的分布式跟踪)

    上周参加了在Geecon上Sam Newman的微服务讨论后,我开始思考更多有关用于监视,报告和诊断的面向服务/微服务平台最可能的基本功能:相关ID. 关联ID允许在面向服务的复杂平台中进行分布式跟踪 ...

  9. java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题

    SSM中 Spring MVC配置 传统的web.xml配置 web.xml contextConfigLocation classpath*:applicationContext.xml org.s ...

最新文章

  1. 【opencv】(7) 图像匹配、直方图、图像均衡化
  2. 【转】利用WCF的双工通信
  3. 【Android 应用开发】Android应用的自动更新模块
  4. nyoj496巡回赛-拓扑排序-拓扑序列
  5. 保持学习,从这几个公众号开始!
  6. 程序员面试金典 - 面试题 04.05. 合法二叉搜索树(中序遍历)
  7. Vue版todolist案例
  8. Android 系统(225)---Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转
  9. php去掉 x5E,清除wordpress里PHP文件恶意代码
  10. Qt4_实现自定义委托
  11. 计算机复试考研专业课,2018计算机考研专业课复试复习攻略
  12. vue-cli3.x正确打包项目,解决静态资源与路由加载无效的问题,history模式下配合使用nginx运行打包后的项目
  13. DoG(Difference of Gaussian)
  14. DIV下的DIV居中
  15. 图书馆系统java实训报告_基于Java的图书馆管理系统的设计实习报告
  16. js+java实现登录滑动图片验证功能
  17. 【C语言】算法学习·哈希算法全解
  18. Android monkey 压力测试
  19. 磁力聚合搜索工具中文版magnetW 3.1.1
  20. 模拟器怎么安装xposed框架

热门文章

  1. 一阶和二阶电路的时域分析
  2. Chrome(谷歌)浏览器永久关闭恢复页面提示框
  3. Arduino UNO+L298驱动直流电机正反转+Proteus仿真
  4. Day25 打卡第二十五天
  5. arm11处理器架构详细分析
  6. ls一1测距仪说明书_杜克 LS-P激光测距仪开箱及上手体验
  7. 进口红外热像仪Fluke TI480 PRO ,FLUKE TI401RPO怎么样
  8. 无线网络连接不上请检查服务器,网络连接中断,请检查上行连路连接或联系ISP解决在手机上出现怎么办?而且家里的网刚修过换了新的。...
  9. 对学校的希望和寄语_家长对孩子的希望和寄语
  10. 拥有用于游戏的独立服务器的好处