Spring中的AOP异步操作

一、异步业务描述

当我们项目中的一些非核心业务运行时,影响到用户核心业务的响应时间,导致用户体验下降,可以将这些非业务放到新的线程中异步执行。

二、启动Spring中异步操作

在SpringBoot工程,可以在启动类的上面,添加启动异步操作的注解(@EnableAsync)描述,代码如下:

1 @EnableAsync
2 @SpringBootApplication
3 public class Application {
4     public static void main(String[] args) {
5         SpringApplication.run(Application.class, args);
6     }
7 }

说明,当启动类上添加了@EnableAsync注解描述时,再次运行启动类时底层会帮我们配置一个线程池

三、业务方法上执行异步操作

假如此时某个业务方法需要执行异步操作,可以使用@Async注解对方法进行描述,例如写日志的业务。

1 @Async
2 public void saveObject(Log entity){
3     sysLogDao.insertObject(entity);
4 }

其中,@Async注解描述的方法,在spring中会认为这是一个异步切入点方法, 在这个切入点方法执行时,底层会通过通知方法获取线程池中的线程,通过池中的线程调用切入点方法(底层默认池类型为ThreadPoolExecutor类型)。

四、Spring中异步线程池的配置

当springboot中默认的线程池配置,不满足我们实际项目需求时,我们可以对线程池进行自定义的配置,关键配置如下:

1 spring: 
2    task:
3     execution:
4       pool:
5         core-size: 8
6         max-size: 256
7         keep-alive: 60000
8         queue-capacity: 256
9       thread-name-prefix: db-service-task-

其中:

1)core-size :核心线程数,当池中线程数没达到core-size的值时,每接收一个新的任务都会创建一个新线程,然后存储到池。假如池中线程数已经达到core-size设置的值,再接收新的任务时,要检测是否有空闲的核心线程,假如有,则使用空闲的核心线程执行新的任务。

2)queue-capacity:队列容量,假如核心线程数已达到core-size设置的值,并且所有的核心线程都在忙,再来新的任务,会将任务存储到任务队列。

3)max-size: 最大线程数,当任务队列已满,核心线程也都在忙,再来新的任务则会创建新的线程,但所有线程数不能超过max-size设置的值,否则可能会出现异常(拒绝执行)

4)keep-alive:线程空闲时间,假如池中的线程数多余core-size设置的值,此时又没有新的任务,则一旦空闲线程空闲时间超过keep-alive设置的时间值,则会被释放。

5)thread-name-prefix:线程名的前缀,项目中设置线程名的目的主要是为了对线程进行识别,一旦出现线程问题,可以更好的定位问题。

 

原文地址:https://www.cnblogs.com/houyu/p/14284605.html