SpringBoot2.3中@Async实现异步
启动加上@EnableAsync ,需要执行异步方法上加入@Async。
在方法上加上@Async之后 底层使用多线程技术。
不使用异步
先关代码:
package com.yiyang.myfirstspringdemo.controller;
import com.yiyang.myfirstspringdemo.service.HelloService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@Slf4j
public class HelloController {
@Resource
private HelloService helloService;
@GetMapping("/helloAsync")
public String helloAsync() {
log.info("1");
helloService.addHello();
log.info("4");
return "hello world ==== async";
}
}
package com.yiyang.myfirstspringdemo.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Author 刘翊扬
* @Date 2020/10/3 3:14 下午
* @Version 1.0
*/
@Service
@Slf4j
public class HelloService {
public void addHello() {
log.info("2");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("3");
}
}
不使用异步处理。
正常输出的顺序:1 2 3 4
2020-10-03 15:49:41,174 INFO HelloController:24 - 1
2020-10-03 15:49:41,175 INFO HelloService:22 - 2
2020-10-03 15:49:43,182 INFO HelloService:29 - 3
2020-10-03 15:49:43,182 INFO HelloController:26 - 4
2020-10-03 15:49:43,185 INFO LogAspect:51 - RESPONSE : hello world ==== async
使用异步
在addHello()方法上面加上@Async
同时,启动类上开启异步调用
package com.yiyang.myfirstspringdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication(scanBasePackages = {"com.yiyang.myfirstspringdemo"})
//@SpringBootApplication
@EnableAsync // 开启异步调用
public class MyFirstSpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstSpringDemoApplication.class, args);
}
}
再次访问,结果是:1 4 2 3
2020-10-03 15:52:52,660 INFO HelloController:24 - 1
2020-10-03 15:52:52,666 INFO HelloController:26 - 4
2020-10-03 15:52:52,675 INFO HelloService:23 - 2
2020-10-03 15:52:52,675 INFO LogAspect:51 - RESPONSE : hello world ==== async
2020-10-03 15:52:54,681 INFO HelloService:30 - 3
注意:在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解会失效
例如:
改造HelloService
package com.yiyang.myfirstspringdemo.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @Author 刘翊扬
* @Date 2020/10/3 3:14 下午
* @Version 1.0
*/
@Service
@Slf4j
public class HelloService {
public void addHello() {
log.info("2");
sendMessage();
log.info("3");
}
@Async
public void sendMessage() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("发送消息!!!!!");
}
}
访问结果是:1 2 3 4
2020-10-03 15:55:51,449 INFO HelloController:24 - 1
2020-10-03 15:55:51,585 INFO HelloService:17 - 2
2020-10-03 15:55:53,595 INFO HelloService:29 - 发送消息!!!!!
2020-10-03 15:55:53,596 INFO HelloService:19 - 3
2020-10-03 15:55:53,598 INFO HelloController:26 - 4
2020-10-03 15:55:53,599 INFO LogAspect:51 - RESPONSE : hello world ==== async
解决办法。。。。。。
讲sendMessage()方法放到别的类里面。
新建SendMessageService类
package com.yiyang.myfirstspringdemo.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
* @Author 刘翊扬
* @Date 2020/10/3 3:37 下午
* @Version 1.0
*/
@Service
@Slf4j
public class SendMessageService {
@Async
public void sendMessage() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("发送消息!!!!!");
log.info("5");
}
}
修改HelloService的内容
package com.yiyang.myfirstspringdemo.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Author 刘翊扬
* @Date 2020/10/3 3:14 下午
* @Version 1.0
*/
@Service
@Slf4j
public class HelloService {
@Resource
private SendMessageService sendMessage;
public void addHello() {
log.info("2");
sendMessage.sendMessage();
log.info("3");
}
}
访问结果是:1 2 3 4 5
2020-10-03 16:00:30,870 INFO HelloController:24 - 1
2020-10-03 16:00:30,871 INFO HelloService:22 - 2
2020-10-03 16:00:30,875 INFO HelloService:24 - 3
2020-10-03 16:00:30,891 INFO HelloController:26 - 4
2020-10-03 16:00:30,901 INFO LogAspect:51 - RESPONSE : hello world ==== async
2020-10-03 16:00:32,889 INFO SendMessageService:23 - 发送消息!!!!!
2020-10-03 16:00:32,890 INFO SendMessageService:24 - 5
那么为什么,在同一类中一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解会失效呢????
看这个博客:https://blog.csdn.net/clementad/article/details/47339519
SpringBoot2.3中@Async实现异步的更多相关文章
- ASP.NET sync over async(异步中同步,什么鬼?)
async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...
- Spring中@Async注解实现“方法”的异步调用
原文:http://www.cnblogs.com/zhengbin/p/6104502.html 简单介绍: Spring为任务调度与异步方法执行提供了注解支持.通过在方法上设置@Async注解,可 ...
- HTML5中script的async属性异步加载JS
HTML5中script的async属性异步加载JS HTML4.01为script标签定义了5个属性: charset 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer 可 ...
- spring boot中使用@Async实现异步调用任务
本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...
- 【转】C# Async/Await 异步编程中的最佳做法
Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...
- 如何在项目中使用Spring异步调用注解@Async
本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置.异常捕获处理. 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync ...
- .NET Web应用中为什么要使用async/await异步编程
前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...
- C#中 Thread,Task,Async/Await 异步编程
什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...
- C++11中async中future用法(一)
async意味着异步执行代码,看如下示例: #include <future> #include <thread> #include <chrono> #inclu ...
随机推荐
- Vue基础(一)---- 模板语法
1.基本理解 Vue其实是一个渐进式JavaScript框架,封装好了一些方法,不再需要操作通过操作DOM,在相同的目标下能够更快的编写代码. 声明式渲染→组件系统→客户端路由→集中式状态管理→项目构 ...
- zstd和zip操作6g的文本
ssd是在固态硬盘上的时间 1.txt 7038308223 bytes 都是默认级别 ======================================== zstd-v1.4.4-w ...
- fragment没有getWindowManager 关于fragment下的报错解决方法
其实很简单:只需要在getWindowManager().getDefaultDisplay().getMetrics(metric) 前面加上getactivity()即可.
- day45:JS中的json&JS的BOM操作和DOM操作
目录 1.补充:CSS中的弹性盒子 2.JS中json的序列化 3.JS中的BOM操作 3.1 location操作 3.2 计时器 4.JS中的DOM操作 4.1 创建标签 4.2 查找标签 4.3 ...
- android 数据绑定(4)实用特性及疑惑:使用控件、格式化@string/xxx、对象传递、双向数据绑定
1.在布局内使用其它控件 1.1 效果 箭头所指3个控件的内容随输入框内容而变化. 1.2 示例代码 <?xml version="1.0" encoding="u ...
- Codeforece E. Anton and Permutation
主席树算贡献l,r中交换位置,算出>=rank(h) 和 <=rank(h) a[l],a[r] 先不统计 a[l]比a[r]大的话交换后ans-1,a[l]比a[r]小的话交换后ans- ...
- 关于js与jquery中的文档加载
jquery中的$(document).ready()类似于javascript中的window.onload(),但是其中还是有很大区别的 1.jquery中的可以简化为$().ready(),$( ...
- 微信小程序授权登录--PHP后端接口
由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...
- 跟着兄弟连系统学习Linux-【day04】
day04-20200601 p15.链接文件 [ln -s 原文件 连接文件]软连接,所有人都可以操作软连接文件(实际上是取决于原文件的权限),类似于Windows的快捷方式,方便进行管理.软连 ...
- leetcode刷题-80.删除排序数组中的重复项 II
题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...