Spring Boot2.0之@Async实现异步调用
补充一个知识点:
lombok底层原理使用的是: 字节码技术ASM修改字节码文件,生成比如类似于get() set( )方法
一定要在开发工具安装 在编译时候修改字节码文件(底层使用字节码技术),线上环境使用编译好的文件
下面我们学习 Spring Boot 异步调用技术:
启动加上@EnableAsync ,需要执行异步方法上加入 @Async
在方法上加上@Async之后 底层使用多线程技术
在底层实际上是帮助创建线程了
首先创建类:MembrController
package com.toov5.jsp; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController; import com.toov5.service.MemberService; import lombok.extern.slf4j.Slf4j; @RestController
@Slf4j
public class MemberController {
@Autowired
private MemberService memberService; public String addMemberAndEmail(){
log.info("1");
String result = memberService.addMemberAndEmail();
log.info("4");
return result;
} }
MemberService
package com.toov5.service; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; @Service
@Slf4j
public class MemberService {
//添加用户时候发送邮件
public String addMemberAndEmail(){
log.info("2");
try {
Thread.sleep(5000);
} catch (Exception e) {
// TODO: handle exception
}
log.info("3");
return "toov5"; } }
我们做个分析:
这个项目是没有开线程的情况下的,代码从上往下同步进行的,log输出结果就是1 2 3 return返回结果 4 然后返回结果
看结果:

先输出1 2 然后 五秒 后 3 4 效果是同步的
下面隆重接受一个注解
@Async 相当于这个方法重新开辟了新的线程去执行

然后启动类一定要加上启动的注解!!!@EnableAsync

加上 @EnableAsync看看指定的包里面 有哪些加了@Asyn注解 加了的在运行时候通过AOP技术,创建线程去执行
执行结果:

controller的代码这样:
package com.toov5.jsp; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.toov5.service.MemberService; import lombok.extern.slf4j.Slf4j; @RestController
@Slf4j
public class MemberController {
@Autowired
private MemberService memberService; @RequestMapping("/addMemberAndEmail")
public String addMemberAndEmail(){
log.info("1");
String result = memberService.addMemberAndEmail();
log.info("4");
return "result"+result;
} }
结果:

结果值是没有拿到 主线程就后已经结束了哈 所以为 null
原理思路:
使用AOP技术,在运行时候 创建单独线程进行执行
可以这么代替:
package com.toov5.service; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; @Service
@Slf4j
public class MemberService {
//添加用户时候发送邮件
// @Async
// public String addMemberAndEmail(){
// log.info("2");
// try {
// Thread.sleep(5000);
// } catch (Exception e) {
// // TODO: handle exception
// }
// log.info("3");
// return "toov5";
//
// } public String addMemberAndEmail(){ new Thread(new Runnable() { public void run() { log.info("2");
try {
Thread.sleep(5000);
} catch (Exception e) {
// TODO: handle exception
}
log.info("3");
// return "toov5"; //这里应该用从callable 有返回值 或者future模式 }
}).start(); return "toov5"; //将就下 返回值由于是用的runnable写的嘛 先这样迁就下 } }
效果:


小伙伴是不是很好玩呀?赶紧尝试一下吧~
Spring Boot2.0之@Async实现异步调用的更多相关文章
- spring boot中使用@Async实现异步调用任务
本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...
- 56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】
什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...
- Spring Boot中使用@Async实现异步调用
在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsyn ...
- Spring Boot中使用@Async实现异步调用,加速任务的执行!
什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行 ...
- Spring Boot使用@Async实现异步调用
原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...
- 【spring cloud】spring cloud2.X spring boot2.0.4调用feign配置Hystrix Dashboard 和 集成Turbine 【解决:Hystrix仪表盘Unable to connect to Command Metric Stream】【解决:Hystrix仪表盘Loading...】
环境: <java.version>1.8</java.version><spring-boot.version>2.0.4.RELEASE</spring- ...
- spring boot 学习(十一)使用@Async实现异步调用
使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...
- Spring Boot2.0 整合 Kafka
Kafka 概述 Apache Kafka 是一个分布式流处理平台,用于构建实时的数据管道和流式的应用.它可以让你发布和订阅流式的记录,可以储存流式的记录,并且有较好的容错性,可以在流式记录产生时就进 ...
- 【spring colud】spring cloud微服务项目搭建【spring boot2.0】
spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...
随机推荐
- C++必知必会(1)
条款1数据抽象 抽象数据类型的用途在于将变成语言扩展到一个特定的问题领域.一般对抽象数据类型的定义须要准训下面步骤: 1. 为类型取一个描写叙述性的名字 2. 列出类型所能运行的操作 ...
- Java reference的种类及使用场景
Java 中一共有 4 种类型的引用 : StrongReference. SoftReference. WeakReference 以及 PhantomReference (传说中的幽灵引用).这 ...
- OpenCV生成点集的Delaunay剖分和Voronoi图
实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...
- html的table使用div创建
午休时间写了一个使用div创建table的案例 1.样式 <style> .table { display: table; } .tableRow { display: table-row ...
- iOS 一些struct类型的NSLog输出
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
- XXE攻击
1.背景 现在很多应用都存在XXE(XML External Entity attack)漏洞,就是xml外部实体攻击,比如facebook,很多XML的解析器默认是含有XXE漏洞的. 2.xml的定 ...
- 淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树
OceanBase是阿里巴巴集团自主研发的可扩展的关系型数据库,实现了跨行跨表的事务,支持数千亿条记录.数百TB数据上的SQL操作. 在阿里巴巴集团下,OceanBase数据库支持了多个重要业务的数据 ...
- opencl教程
http://www.altera.com.cn/corporate/news_room/releases/2013/products/nr-opencl-sdk-13.0.html http://w ...
- 如何创建RESTFul Web服务
想写这篇文章很久了,这是个大话题,不是一时半会就能说清楚的. 所以准备花个一星期整理资料,把思路理清楚,然后再在Team里做个sharing:) 其实RESTFul是架构风格,并不是实现规范,也不一定 ...
- 我的ngnix 配置内容
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...