作者:架构即人生

来源:www.toutiao.com/i6717216694709780996

开启异步支持

@Configuration
@EnableAsync
public class SpringAsyncConfig { ... }

默认情况下,@EnableAsync检测Spring的@Async注释和EJB 3.1 javax. EJB .异步;此选项还可用于检测其他用户定义的注释类型。

@Async注解使用

1.无返回值

@Async
public void asyncMethodWithVoidReturnType() {System.out.println("Execute method asynchronously. "+ Thread.currentThread().getName());
}

2.有返回值

@Async
public Future<String> asyncMethodWithReturnType() {System.out.println("Execute method asynchronously - "+ Thread.currentThread().getName());try {Thread.sleep(5000);return new AsyncResult<String>("hello world !!!!");} catch (InterruptedException e) {//}return null;
}

执行器

默认情况下,Spring 使用SimpleAsyncTaskExecutor去执行这些异步方法(此执行器没有限制线程数)。此默认值可以从两个层级进行覆盖:

  • 方法级别

  • 应用级别

1. 方法级别覆盖

@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {System.out.println("Execute method with configured executor - "+ Thread.currentThread().getName());
}

2. 应用级别覆盖

配置类应该实现AsyncConfigurer接口——这意味着它拥有getAsyncExecutor()方法的实现。在这里,我们将返回整个应用程序的执行器——这现在成为运行带有@Async注释的方法的默认执行器:

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.initialize();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);return executor;}}

异常处理

当方法返回值是Future的时候,异常捕获是没问题的 - Future.get()方法会抛出异常。

但是,如果返回类型是Void,那么异常在当前线程就捕获不到。因此,我们需要添加额外的配置来处理异常。

我们将通过实现AsyncUncaughtExceptionHandler接口创建一个定制的async异常处理程序。handleUncaughtException()方法在存在任何未捕获的异步异常时调用:

public class CustomAsyncExceptionHandlerimplements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable throwable, Method method, Object... obj) {System.out.println("Exception message - " + throwable.getMessage());System.out.println("Method name - " + method.getName());for (Object param : obj) {System.out.println("Parameter value - " + param);}}}

在上一节中,我们研究了由configuration类实现的AsyncConfigurer接口。作为其中的一部分,我们还需要覆盖getAsyncUncaughtExceptionHandler()方法来返回我们自定义的异步异常处理程序:

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return new CustomAsyncExceptionHandler();
}

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别!

这回把Spring @Async彻底搞懂了相关推荐

  1. 一张图搞懂Spring bean的完整生命周期

    转载自 一张图搞懂Spring bean的完整生命周期 一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任 ...

  2. 一文带你搞懂从动态代理实现到Spring AOP

    摘要:本文主要讲了Spring Aop动态代理实现的两种方式. 1. Spring AOP Spring是一个轻型容器,Spring整个系列的最最核心的概念当属IoC.AOP.可见AOP是Spring ...

  3. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  4. 想开发IM集群?先搞懂什么是RPC!

    本文引用了后端技术指南针公众号"浅谈RPC那些事儿1"和即时通讯网的"即时通讯新手入门:快速理解RPC技术--基本概念.原理和用途"两篇文章的部分内容. 1.引 ...

  5. 想要彻底搞懂“异地多活”,看完这篇就够了

    在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理. 异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的? 这些疑问,想必 ...

  6. layer output 激活函数_一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)...

    在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...

  7. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  8. 彻底搞懂---三握四挥

    目录 三握手 四挥手 三握手 正所谓,工欲善其事,必先利其器. 我们要想搞懂三次握手必须得先知道一些基础的东西. 我们先分析一下上图的英文都是啥东西. SYN: 代表连接请求/连接接受 ACK: 确认 ...

  9. 汉字乱码_彻底搞懂这烦人的编码与乱码!

    ❝ 我们平时在处理文本文件或者网络请求时,时不时会遇到乱码的情况,这篇文章就带你彻底搞懂编码和乱码 ❞ 首先,我们要知道,在计算机中,一切都是用0和1来表示的.普通的txt文件.或者客户端发过来的数据 ...

  10. IM的扫码登录功能如何实现?一文搞懂主流的扫码登录技术原理

    本文引用了3位作者"精品唯居"."  Yangfan2016"." MrYun"的部分文章内容,一并感谢. 1.引言 扫码登录这个功能,最早 ...

最新文章

  1. abaqus最大应力准则怎么用_ANSYS与ABAQUS对比,你选择那个?
  2. (Head First 设计模式)学习笔记(1)
  3. 推荐一个以动画效果显示github提交记录的黑科技工具:Gource
  4. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
  5. Linux学习笔记4.4-Linux重定向
  6. Python中and、or、not用法
  7. 经典算法题--求对策字符串的最大长度
  8. 数值分析书籍以及Intel性能分析工具
  9. 吴裕雄 02-mysql PHP语法
  10. mysql编码方式查看_Mysql必读查看mysql编码方式 mysql数据库编码查看方法
  11. Android ASM字节码插桩
  12. CCF中A类和B类会议投稿时间和投稿页面整理(人工智能、网络安全、数据库相关)
  13. 【Python入门】Turtle海龟库:利用海龟画笔交互绘制字符旋涡
  14. Linux头文件 C/C++头文件
  15. 外观模式——透过现象看本质
  16. 上取整与下取整的解析
  17. c++基础题:判断某整数是否既是5又是7的整数倍
  18. word表格的编辑 计算机应用基础(4)
  19. Django 配置数据库相关
  20. Dijkstra 最短路径算法 秒懂详解

热门文章

  1. Linux 设置交换分区
  2. UITableView的复用过程
  3. 将list中的数据组成用逗号分隔的字符串
  4. 鄂尔多斯打造西部云计算基地
  5. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  6. inDesign教程,如何设置打印出血?
  7. 苹果mac专业音频处理软件:Audition
  8. 如何开始在 Mac 上使用快捷方式?
  9. 苹果 Mac 上不显示外置硬盘?9 个必须尝试的修复方法
  10. 苹果Mac 2D/3D数字雕刻软件:Pixologic Zbrush