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:線程名的前綴,項目中設置線程名的目的主要是為了對線程進行識別,一旦出現線程問題,可以更好的定位問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM