背景分析
當我們專案中的一些非核心業務運行時,影響到用戶核心業務的回應時間,導致用戶體驗下降,我們該如何處理?
異步應用分析
當我們專案中的一些非核心業務運行時,因其耗時操作,影響到用戶核心業務的回應時間,此時可以將這些非核心業務的耗時操作放到新的執行緒中異步執行,例如:
new Thread(new Runnable() {
@Override
public void run() {
//耗時操作
}
}).start();
對于如上形式的異步實作方式,在并發比較小的時候可以,但是一旦并發量比較大時,反復創建執行緒和銷毀執行緒會帶來很大系統開銷,進而影響整體性能,
SpringBoot工程中的異步
啟動異步
SpringBoot工程中默認支持異步操作,但是我們需要首先在啟動類的上面,添加啟動異步操作的注解(@EnableAsync)描述,代碼如下:
@EnableAsync
@SpringBootApplication
public class DbpmsApplication {
public static void main(String[] args) {
SpringApplication.run(DbpmsApplication.class, args);
}
}
更多注解可參考博客:https://blog.csdn.net/weixin_53601359/article/details/114378460
定義切入點方法
假如此時某個業務方法需要執行異步操作,可以使用@Async注解對方法進行描述,例如寫日志的業務,關鍵代碼如下:
@Asyncpublic
void saveLog(SysLog entity){
//Log切面中呼叫的方法
sysLogDao.insertLog(entity)
}
其中,@Async注解描述的方法,在spring中會認為這是一個異步切入點方法,在這個切入點方法執行時,底層會通過通知方法獲取執行緒池中的執行緒,通過池中的執行緒呼叫切入點方法(底層默認池型別為ThreadPoolExecutor型別)
自定義執行緒池的配置
當springboot中默認的執行緒池配置,不滿足我們實際專案需求時,我們可以對執行緒池進行自定義的配置,關鍵配置如下:
spring.task.execution.pool.core-size=8
spring.task.execution.pool.max-size=256
spring.task.execution.pool.keep-alive=60000
spring.task.execution.pool.queue-capacity=512
spring.task.execution.thread-name-prefix=async-service-task-
其中:
- core-size :核心執行緒數,當池中執行緒數沒達到core-size的值時,每接收一個新的任務都會創建一個新執行緒,然后存盤到池,假如池中執行緒數已經達到core-size設定的值,再接收新的任務時,要檢測是否有空閑的核心執行緒,假如有,則使用空閑的核心執行緒執行新的任務,
- queue-capacity:佇列容量,假如核心執行緒數已達到core-size設定的值,并且所有的核心執行緒都在忙,再來新的任務,會將任務存盤到任務佇列,
- max-size: 最大執行緒數,當任務佇列已滿,核心執行緒也都在忙,再來新的任務則會創建新的執行緒,但所有執行緒數不能超過max-size設定的值,否則可能會出現例外(拒絕執行)
- keep-alive:執行緒空閑時間,假如池中的執行緒數多余core-size設定的值,此時又沒有新的任務,則一旦空閑執行緒空閑時間超過keep-alive設定的時間值,則會被釋放,
- thread-name-prefix:執行緒名的前綴,專案中設定執行緒名的目的主要是為了對執行緒進行識別,一旦出現執行緒問題,可以更好的定位問題,
更多常用配置可參考博客:https://blog.csdn.net/weixin_53601359/article/details/114416191
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280682.html
標籤:java
