Spring AOP 异步操作实现

异步场景分析

在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”。说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用Spring的@Async的异步注解。

5.1Spring 业务的异步实现

5.1.1启动异步配置

在基于注解方式的配置中,借助@EnableAsync注解进行异步启动声明,Spring Boot版的项目中,代码示例如下:
Spring AOP 异步操作实现_第1张图片

5.1.2Spring中@Async注解应用

在需要异步执行的业务方法上,使用@Async方法进行异步声明。
Spring AOP 异步操作实现_第2张图片
假如需要获取业务层异步方法的执行结果,可参考如下代码设计进行实现:
Spring AOP 异步操作实现_第3张图片
其中,AsyncResult对象可以对异步方法的执行结果进行封装,假如外界需要异步方法结果时,可以通过Future对象的get方法获取结果。
说明:对于@Async注解默认会基于ThreadPoolTaskExecutor对象获取工作线程,然后调用由@Async描述的方法,让方法运行于一个工作线程,以实现异步操作。但在并发量较大情况下可能会出现OOM,因为ThreadPoolTaskExecutor对象中核心线程数是8。随着任务的增多,线程数量也可能会增加,堆中要不断的为线程对象分配空间,当GC速度慢于对象创建速度时,OOM可能就会出现了。

5.1.3Spring 自定义异步池的实现(拓展)

为了让Spring中的异步池更好的服务于我们的业务,同时也尽量避免OOM,可以自定义线程池优化设计如下:关键代码如下:
Spring AOP 异步操作实现_第4张图片

其中: @ConfigurationProperties(“async-thread-pool”)的含义是读取application.yml配置文件中以"async-thread-pool"名为前缀的配置信息,并通过所描述类的set方法赋值给对应的属性,在application.yml中连接器池的关键配置如下:
在这里插入图片描述
后续在业务类中,假如我们使用@Async注解描述业务方法,默认会使用ThreadPoolTaskExecutor池对象中的线程执行异步任务。

你可能感兴趣的:(Spring AOP 异步操作实现)