Spring @Async的异常处理

楼主在前面的2篇文章中,分别介绍了Java子线程中通用的异常处理,以及Spring web应用中的异常处理。链接如下:

Java子线程中的异常处理(通用)

Spring Boot应用中的异常处理

今天,要写的是被Spring @Async注解方法中的异常处理方法。

通常,如果我们要在程序中做一个耗时的操作(例如调用其他外部模块),一般会通过异步的方式执行。

有这2种方法:

  • 自行生成线程池ThreadPoolExecutor,提交任务执行
  • 更方便地,使用Spring @Async注解,修饰在需要异步执行的方法上

对于第一种方法的异常处理,楼主已经在“Java子线程中的异常处理(通用)”这篇文章中介绍了,也就是提交任务后获取到Future对象,通过future.get()获取返回值的时候能够捕获到ExcecutionException。

对于Spring @Async注解的方法,如何进行异常处理呢?楼主想到了2种方法。

解决办法

方法一:配置AsyncUncaughtExceptionHandler(对于无返回值的方法)

通过AsyncConfigurer自定义线程池,以及异常处理。

@Configuration@EnableAsyncpublic class SpringAsyncConfiguration implements AsyncConfigurer { private static final Logger logger = LoggerFactory.getLogger(getClass()); @Bean @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(16); executor.setQueueCapacity(64); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.setThreadNamePrefix(“SpringAsyncThread-“); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new SpringAsyncExceptionHandler(); } class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler { @Override public void handleUncaughtException(Throwable throwable, Method method, Object… obj) { logger.error(“Exception occurs in async method”, throwable.getMessage()); } }}

方法二:通过AsyncResult捕获异常(对于有返回值的方法)

如果异步方法有返回值,那就应当返回AsyncResult类的对象,以便在调用处捕获异常。

因为AsyncResult是Future接口子类,所以也可以通过future.get()获取返回值的时候捕获ExcecutionException。

异步方法:

@Servicepublic class AsyncService { @Async public AsyncResult asyncMethodWithResult() { // do something(可能发生异常) return new AsyncResult(“hello”); }}

调用处捕获异常:

public class Test { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired AsyncService asyncService; public void test() { try { Future future = asyncService.asyncMethodWithResult(); future.get(); } catch (ExecutionException e) { logger.error(“exception occurs”, e); } catch (InterruptedException e) { logger.error(“exception occurs”, e); } }}

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月22日
下一篇 2022年6月22日

相关推荐

  • Node.js vs Python:如何选择最好的技术来开发你的后端

    选择后端编程语言绝非易事。毕竟不同的语言各有优缺点,我们需要考虑它是否是构建应用程序的正确工具。 Node.js 和 Python 是后端开发的两个最受欢迎的选择。两者都有非常强大…

    2022年6月15日
  • 羊了个羊怎么才能100%通关?羊了个羊五分钟无敌通关秘诀技巧

    羊了个羊怎么才能100%通关?这款小游戏通关的方法最近非常多的人都在研究,小编今天为大家带来的就是五分钟无敌通关秘诀,通关的小技巧小编已经整理好分享在下面,详细的各位赶紧一起来看看…

    2022年9月17日
  • 美媒:iPhone15确认使用USB – C口,今年升级有遗憾

    关于苹果改用USB – C传闻已久,欧盟、美国相关部门都为此做出巨大努力,强迫库克必须顺应大势所趋。最新有美媒报道,苹果终于承受不住压力愿意做出改变,只是iPhone1…

    2022年6月29日
  • 兄弟打印机清零方法(部分型号)

    一、兄弟4040/4050彩打硒鼓清零方法 兄弟4040CN彩色激光打印机更换硒鼓后清零方法如下: 当打印机出现“Drum End Soon”等字母提示时,就提醒您要更换硒鼓了。 …

    2022年6月24日
  • 84消毒液的正确配比及方法注意事项!

    84消毒液该如何正确的进行配比?它的比例又是多少呢?大家一定要仔细根据文章内容的详细说明来进行兑比。 84消毒液是很多家庭必备的物品,尤其是疫情期间。今天小编来和大家说一说,84消…

    2022年8月13日
  • 科技伦理研究的方法论创新

    中国网/中国发展门户网讯 随着新兴科技的快速发展,从伦理视角反思新兴科技带给人类的严峻挑战并构建相应的治理框架,已成为各国政府、学界、公众高度关注的议题。近年来,我国高度重视科技伦…

    2022年6月25日
  • 在生活中遇到不开心的事,你可以做这10件事

    你可以冥想,不用复杂的流程,坐下来,闭上眼睛,想任何事情。 你可以写一篇日记,在日记中写下你的问题可以帮助你减轻压力,因为这是表达情绪的好方法,尤其是不愉快的情绪。记下一天中发生的…

    2022年6月27日
  • 案例中的外挂实时监测与数据回扫

    前两天以2011永恒之塔、2014DNF、2016街头篮球、2021坦克世界等相关案例为例,简单回顾了游戏厂商对玩家利用技术手段进行违规行为的判断方法,以及引入技术监测手段时的举证…

    2022年7月10日
  • 斗罗大陆游戏中唐门的装备获取攻略

    在斗罗大陆游戏中,唐门装备有着很多不同的品质,不同品质武器的属性和能力都是很不一样,我们玩过款游戏的小伙伴都知道,只要出自唐门的武器都是质量比较不错的,质量不错的话就会给我们带来不…

    2022年8月17日
  • 优雅关闭线程实践

    前言 在多线程编程中会需要动态创建线程来执行任务,在完成后释放该线程,使用Excuotrs创建的线程,提供了shutDown方法进行线程的关闭,但使用原生的Thread和Runab…

    2022年6月15日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息