zoukankan      html  css  js  c++  java
  • 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:线程名的前缀,项目中设置线程名的目的主要是为了对线程进行识别,一旦出现线程问题,可以更好的定位问题。

     

  • 相关阅读:
    NOI2.5 4980:拯救行动
    NOI2.5 1490:A Knight's Journey
    NOI2.5 8465:马走日
    考试题目“部落卫队”
    考试题目“笨笨的西瓜种植”
    考试题目“笨笨玩游戏”
    NOI4.6 1455:An Easy Problem
    NOI2.5 1253:Dungeon Master
    NOI2.2 8758:2的幂次方表示
    NOI2.5 1817:城堡问题
  • 原文地址:https://www.cnblogs.com/houyu/p/14284605.html
Copyright © 2011-2022 走看看