springboot async异步处理方案
admin
2024-02-07 14:00:37
0

springboot提供了两种异步处理方案,一是传统同步web处理加异步service层,二是异步web处理框架webFlux。

一、传统同步web处理加异步service层

使用流程:在springboot application启动类上添加@EnableAsync注解。在service层类或方法上添加@Async注解,同时在异步方法所在的service层类上添加@Component或@service 等注解,该方法必须返回AsyncResult或CompletableFuture、ListenableFuture、Future之一,然后controller层通过@Autowired自动注入service类并使用异步类。

controller和service层代码如下:

@RestController
public class UserCtroller {@AutowiredUserService userService;@RequestMapping( "/n/{name}")@ResponseBodypublic User getUserByName(@PathVariable String name){AsyncResult> user = userService.getUserByName( name );try{return user.get().isEmpty() ? null: user.get().get() ;} catch (ExecutionException e) {return null;}}@RequestMapping( "/l")@ResponseBodypublic List getAll(){return userService.getAll();}}
@Service
public class UserServiceImpl implements UserService {List users = Arrays.asList(new User( "a", 20 , "aaaa"),new User( "b", 20 , "aaaa"),new User( "c", 20 , "aaaa"));@Override@Asyncpublic AsyncResult> getUserByName(String name){Optional user = users.stream().filter( (u) ->  Objects.equals( u.getName(), name ) ).findFirst();return new AsyncResult<>( user );}@Override@Asyncpublic List getAll(){return  users;}
}

在service的 getUserByName方法内置断点,执行监控调用堆栈,结果如下。可以看出spring采用AOP的方式将@Async的注解的方法封装为异步执行。

getUserByName:26, UserServiceImpl (com.alun.serviceasync)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:77, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:568, Method (java.lang.reflect)
invokeJoinpointUsingReflection:344, AopUtils (org.springframework.aop.support)
invokeJoinpoint:198, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceed:163, ReflectiveMethodInvocation (org.springframework.aop.framework)
lambda$invoke$0:115, AsyncExecutionInterceptor (org.springframework.aop.interceptor)
call:-1, AsyncExecutionInterceptor$$Lambda$778/0x0000000800fb3710 (org.springframework.aop.interceptor)
run$$$capture:264, FutureTask (java.util.concurrent)
run:-1, FutureTask (java.util.concurrent)- 异步堆栈跟踪
:132, FutureTask (java.util.concurrent)
:44, ListenableFutureTask (org.springframework.util.concurrent)
submitListenable:412, ThreadPoolTaskExecutor (org.springframework.scheduling.concurrent)
doSubmit:286, AsyncExecutionAspectSupport (org.springframework.aop.interceptor)
invoke:129, AsyncExecutionInterceptor (org.springframework.aop.interceptor)
proceed:186, ReflectiveMethodInvocation (org.springframework.aop.framework)
invoke:215, JdkDynamicAopProxy (org.springframework.aop.framework)
getUserByName:-1, $Proxy50 (jdk.proxy2)
getUserByName:27, UserCtroller (com.alun.serviceasync)

使用数据库事务时一定要注意:在Async方法上标注@Transactional,事务无效。 在Async方法调用的方法上标注@Transactional 有效。

Springboot中使用@Async实现异步处理及注意事项  这篇文章总结的不错,值得大家参考。

二、异步web处理框架webFlux

spring5提供了webFlux异步处理框架,提高系统吞吐量和伸缩性,以 Reactor为核心,基于Servlet3.1规范实现,即从servlet线程就以异步方式处理请求。springboot提供了TomcatReactiveWebServerFactory、NettyReactiveWebServerFactory、UndertowReactiveWebServerFactory、JettyReactiveWebServerFactory四种ReactiveWebServer实现。默认使用容器是 Netty,Netty 是高性能的 NIO 框架。

controller层的方法需要返回Mono或Flux,service代码不需要改动。如:

@RestController
public class UserCtroller {@AutowiredUserService userService;@RequestMapping( "/n/{name}")public Mono getUserByName( @PathVariable String name){return userService.getUserByName( name );}@RequestMapping( "/l")public Flux getAll(){return userService.getAll();}
}

SpringWebflux 提供两种编程模式:注解编程模型和函数式编程模型。

函数式编程模型参见Spring Webflux

两种方式的gradle文件的配置如下,如需切换server提供方式,可以如下修改:

web mvc方式配置:

    // webimplementation ('org.springframework.boot:spring-boot-starter-web'){exclude  group:'org.springframework.boot', module:'spring-boot-starter-tomcat'}implementation 'org.springframework.boot:spring-boot-starter-undertow'

webFlux方式的配置:

// webfluximplementation ('org.springframework.boot:spring-boot-starter-webflux'){exclude group:'org.springframework.boot', module:'spring-boot-starter-netty'}implementation 'org.springframework.boot:spring-boot-starter-undertow'

相关内容

热门资讯

罕见9连跌,历史第二次!上证5... 最近,A股市场“冰火两重天”,有色金属、国防军工、电子等行业轮番走强,而大盘蓝筹却持续阴跌。 截至1...
见证历史!纽约白银期货、伦敦现... 1月23日晚,又见证历史了。1月23日晚间,纽约白银期货、伦敦现货白银双双突破100美元历史性关口!...
原创 淘... 当电商转向价值竞争,好服务成了好增长的密钥。 原创ⓒ新熵 新消费组 作者丨栀子 编辑丨九黎 进入20...
晚上9点后别做这几件事!一个好... 太原龙城中医医院科普:对于肺结节人群而言,除了饮食、运动等日常养护,优质睡眠的重要性往往被忽视。中医...
破“7”!人民币汇率中间价调升... 北京商报讯(记者 廖蒙)1月23日,中国人民银行授权中国外汇交易中心公布,当日银行间外汇市场人民币汇...
原创 异... 在探讨异性交往的微妙关系时,我们不得不提到一个至关重要的话题——男性回家后的行为模式。高情商的女性往...
和讯投顾王海洋:大盘震荡收星,... 1月23日,和讯投顾王海洋表示,大盘震荡收星,平均股价再创新高。昨日曾提到,今日大盘大概率会再次触摸...
马斯克成为科技行业“风向标” ... 来源:@投中网微博 【马斯克成为科技行业“风向标” 带火汽车航天光伏三大领域】作为科技行业标杆与全球...
凝“新”聚力│发挥“联”优势 ... 前 言 为深入贯彻落实习近平总书记同全国妇联新一届领导班子成员集体谈话时提出的“加大在新经济组织、新...
【日常消费品ETF收涨约0.8... 【日常消费品ETF收涨约0.8%,领跑美股行业ETF,半导体ETF跌约0.7%,银行业ETF跌超3....
每月最高800元!中度以上失能... 民政部、财政部日前印发通知,从今年1月1日起,面向中度以上失能老年人发放养老服务消费补贴的政策在全国...
龙虎榜揭秘!大牛股背后资金动向... 龙虎榜揭秘。 近期A股市场整体波动较为平稳,但不少个股波动剧烈,甚至连续涨停或连续跌停,近日的龙虎榜...
原创 全... 全球都在用美元? 中国偷偷搞了个大动作! 美元占全球支付50%时人民币干了啥? 你可能不知道的是,当...
我国银行理财市场规模突破33万... 银行业理财登记托管中心1月23日发布的《中国银行业理财市场年度报告(2025年)》显示,截至2025...
最高分红率35%!上市银行春节... 随着春节临近,上市银行2025年中期分红逐渐进入尾声。 1月23日,华夏银行、渝农商行迎来2025年...
蔡英丽医生:帕金森患者麻醉注意... 帕金森病是中老年人常见的神经系统退行性疾病,随着病情进展,不少患者可能需要接受各类手术,而麻醉环节的...
原创 利... 朋友们,今天A股发生了一件挺有意思的事:在地面光伏行业不少公司还在为亏损发愁的时候,一个叫做“太空光...
二游王战之局,鹰角先下一城 2026二游王战的启幕来了。1月22日,鹰角《明日方舟:终末地》(以下简称终末地)正式公测,和我们预...
大润发首次跨界合作蛋仔派对,以... 2026年春节前夕,高鑫零售旗下核心品牌大润发与国民级游戏IP《蛋仔派对》正式达成深度跨界合作,共同...
2025年基金4季报重仓股全扫... 随着基金2025年4季报基本披露完毕,记者注意到,截至去年底,基金的重仓股发生了比较明显的变化,有5...