SpringBoot中如何优雅地实现异步调用?
前言
SpringBoot想必大家都用过,但是大家平时使用发布的接口大都是同步的,那么你知道如何优雅的实现异步呢?
这篇文章就是关于如何在SpringBoot中实现异步行为的。但首先,让我们看看同步和异步之间的区别。同步编程:在同步编程中,任务一次执行一个,只有当一个任务完成时,下一个任务才会被解除阻塞。异步编程:在异步编程中,可以同时执行多个任务。您可以在上一个任务完成之前转到另一个任务。
在SpringBoot中,我们可以使用Async注解来实现异步行为。实现步骤定义一个异步服务接口AsyncService。javapublicinterfaceAsyncService{voidasyncMethod()throwsInterruptedException;FutureStringfutureMethod()throwsInterruptedException;}复制代码实现定义的接口AsyncServiceImpl。javaServiceSlf4jpublicclassAsyncServiceImplimplementsAsyncService{AsyncOverridepublicvoidasyncMethod()throwsInterruptedException{Thread。sleep(3000);log。info(Thread:〔{}〕,Callingotherservice。。,Thread。currentThread()。getName());}AsyncOverridepublicFutureStringfutureMethod()throwsInterruptedException{Thread。sleep(5000);log。info(Thread:〔{}〕,Callingotherservice。。,Thread。currentThread()。getName());returnnewAsyncResult(taskDone);}}复制代码AsyncServiceImpl是一个spring管理的bean。您的异步方法必须是公共的,而且是被Async注解修饰。返回类型被限制为void或Future。定义一个控制器AsyncController。javaEnableAsyncRestControllerSlf4jpublicclassAsyncController{AutowiredAsyncServiceasyncService;GetMapping(async)publicStringasyncCallerMethod()throwsInterruptedException{longstartSystem。currentTimeMillis();log。info(callasyncmethod,threadname:〔{}〕,Thread。currentThread()。getName());asyncService。asyncMethod();Stringresponsetaskcompletesin:(System。currentTimeMillis()start)milliseconds;returnresponse;}GetMapping(asyncFuture)publicStringasyncFuture()throwsInterruptedException,ExecutionException{longstartSystem。currentTimeMillis();log。info(callasyncmethod,threadname:〔{}〕,Thread。currentThread()。getName());FutureStringfutureasyncService。futureMethod();阻塞获取结果StringtaskResultfuture。get();StringresponsetaskResulttaskcompletesin:(System。currentTimeMillis()start)milliseconds;returnresponse;}}复制代码关键点,需要添加启用异步的注解EnableAsync,当然这个注解加在其他地方也ok得。当外部调用该接口时,asyncMethod()将由默认任务执行程序创建的另一个线程执行,主线程不需要等待完成异步方法执行。运行一下
现在我们运行一下看看,是不是异步返回的。
可以看到调用async接口,最终一步调用了方法。
调用asyncFuture,发现返回5秒多,难道不是异步的吗?其实也是异步的,看日志可以看出来,只不过我们返回的是Future,调用Futrue。get()是阻塞的。自定义异步任务执行器和异常处理
我们现在看看如果异常方法中报错了会怎么样?修改异步代码如下所示,会抛运行时异常:
再次执行异步接口,如下所示,会使用默认的线程池和异常处理。
我们也可以自定义异步方法的处理异常和异步任务执行器,我们需要配置AsyncUncaughtExceptionHandler,如下代码所示:ConfigurationpublicclassAsynConfigurationextendsAsyncConfigurerSupport{OverridepublicExecutorgetAsyncExecutor(){ThreadPoolTaskExecutorexecutornewThreadPoolTaskExecutor();executor。setCorePoolSize(3);executor。setMaxPoolSize(4);executor。setThreadNamePrefix(asyntaskthread);executor。setWaitForTasksToCompleteOnShutdown(true);executor。initialize();returnexecutor;}OverridepublicAsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler(){returnnewAsyncUncaughtExceptionHandler(){OverridepublicvoidhandleUncaughtException(Throwableex,Methodmethod,Object。。。params){System。out。println(Exception:ex。getMessage());System。out。println(MethodName:method。getName());ex。printStackTrace();}};}}复制代码
再次运行,得到的结果如下:
Async如何工作的?
必须通过使用EnableAsync注解注解主应用程序类或任何直接或间接异步方法调用程序类来启用异步支持。主要通过代理模式实现,默认模式是Proxy,另一种是AspectJ。代理模式只允许通过代理拦截调用。永远不要从定义它的同一个类调用异步方法,它不会起作用。
当使用Async对方法进行注解时,它会根据proxyTargetClass属性为该对象创建一个代理。当spring执行这个方法时,默认情况下它会搜索关联的线程池定义。上下文中唯一的spring框架TaskExecutorbean或名为taskExecutor的Executorbean。如果这两者都不可解析,默认会使用spring框架SimpleAsyncTaskExecutor来处理异步方法的执行。总结
在本文中,我们演示了在springboot中如何使用Async注解和异步方法中的异常处理实现异步行为。我们可以在一个接口中,需要访问不同的资源,比如异步调用各个其他服务的接口,可以使用Async,然后将结果通过Future的方式阻塞汇总,不失为一个提高性能的好方法。
阿迪达斯寻找椰子鞋代替品连续几日,上海市武康路的阿迪达斯Samba快闪店前早早排起了长队。球鞋二道贩子小辉捏着刚取到的号站在中间望着龟速前进的队伍。我是95号,还得等一会儿,没那么快的。没了yeezy,阿
越南美女太惊艳!倾国倾城!奥黛是越南国服越语里ao指遮盖到颈部以下的服饰而dai的意思是长与旗袍一样也是展现女子身形婀娜的传统服饰奥黛源于旗袍上衣是一件长衫,类似中国旗袍胸袖剪裁非常合身突显女性玲珑有致的曲
四肢瘦,肚子大,怎么搭配?四肢瘦,肚子大,穿衣搭配重在扬长避短,平时搭配要重点把肚子遮住,同时体现四肢。诸如,一宽松上衣搭配阔腿裤是不错的选择二宽松上衣搭配短裤或短裙可以扬长避短三宽松连衣裙可以达到遮挡肚子
过膝马甲怎么搭配好看?马甲是比较帅气的搭配单品,搭配衬衫西裤是最帅的,毕竟都是属于正装系列,尽管过膝的马甲属于休闲了,但依然挡不住它帅气的颜值。然而马甲搭配衬衫就太普通了,也比较束缚,既然是内搭,那么不
娱乐圈水有多深?成龙今天一天报了两次娱乐圈水很深,黑幕深,没有背累和靠山的千万别进去,免得把小命搭进去了,例如乔任梁就是一个例子,明明是遭亡恶魔残酷虐杀的,恶势力硬用钱抹平成一个抑郁自杀的,那就是
上海滩的几个版本哪个版本留给我们的记忆最深刻?周润发饰许文强,吕良伟饰丁力,赵雅芝饰冯程程,经典从未被超越!四个版本,印象深刻的当然是周润发赵雅芝吕良伟主演的第一个版本,其余都是模仿,没法超越。特别是周润发的表演就像本色出演,
macOSBigSur11。7。5(20G1225)正式版发布ISOPKGDMGIPSW下载2023年3月27日(北京时间28日凌晨),macOSVentura13。3正式版发布,本更新包括全新表情符号以及针对Mac的其他增强功能错误修复和安全性更新。同时发布了macOS
vivoS16亮相松美术馆艺术展演绎机圈色彩新潮流手机中国新闻2023年3月11日至4月16日,vivoS16系列颜如玉以及以之为灵感创作的潮流艺术品,在北京松美术馆流动的本能艺术展展出。与此同时,vivoS16春日悠蓝全新配色也
严重可能导致上眼睑下垂!就算全切双眼皮简单,也要找靠谱的医生全切双眼皮手术真的可能会导致上眼睑下垂!!!虽然这种情况并不常见,但如果碰到了,可就麻烦了。全切双眼皮后的眼睑下垂,可能与手术技术术后护理个体差异等因素有关。但医生的技术,绝对是其
解决争执后,海莉比伯喜欢赛琳娜戈麦斯性感的比基尼泳装赛琳娜戈麦斯(SelenaGomez)分享了一张穿着比基尼的复古照片,海莉比伯(HaileyBieber)点了赞。不能把她的喜欢留给自己。周日,30岁的赛琳娜戈麦斯(SelenaG
有哪些老歌曲值得你回忆?经常想起小时候唱的东方红,太阳升,中国出了个毛泽东,还有大海航行靠舵手,干革命靠的是毛泽东思想,现在经常回忆这两首歌。没事就唱一唱。毛泽东时代的老歌一字不改的值得回忆,改了就没有回