目錄
Spring中異步方法的使用
1. 異步方法描述
2. 異步方法的實作步驟
3. 實測一下
3.1 定義個Service類
3.2 定義個測試Controlle
3.3 在啟動類上啟用異步
3.4 測試
4. 補充
4.1 Executor線程池
4.2 異步傳回Futrue
4.3 其他注意事項
異步方法,顧名思義就是調用後無須等待它的執行,而繼續往下執行;@Async是Spring的一個注解,在Spring Boot中,我們隻需要使用@Async注解就能簡單的将原來的同步函數變為異步函數。
對于比較耗時的操作,我們可以抽取成異步方法來讓主線程穩定快速繼續執行,對于異步方法的執行結果可根據自己的要求是否需要在主線程處理;
在springboot應用我們可以使用簡單的兩個注解即可開啟并使用異步方法;
建立一個普通的Service類,并有@Service修飾,表示這個服務類交給Spring管理;
在Service方法裡定義一個普通的方法,使用@Async修飾;表示這是一個異步方法;
在引導類中添加@EnableAsync注解,使應用開啟對異步方法的支援;
可以看到輸出,controlle中調用了異步方法後繼續執行,即使異步方法報錯也不會controller的執行;
上面的測試,我們并沒有建立新的線程和線程池,如果我們不配置線程池的Bean,Spring會自動建立SimpleAsyncTaskExecutor,并使用它來執行異步方法。定義線程池bean可參考如下:
4.2.1 這樣改造我們的異步方法,即傳回一個Futrue類型的結果;
4.2.2 Contorller也改造下
使用了Futrue.get方法,controller主線程就會等待異步方法的執行結束,或等待逾時後才會結束。
在同一個類中的方法調用,添加@async注解是失效的。原因是當你在同一個類中的時候,方法調用是在類中執行的,spring無法截獲這個方法調用,也就不會在代理類裡執行。
可能會導緻循環依賴,spring本身會解決循環依賴,但是因為@Async使用代理模式,spring在檢查第二級緩存和原始對象是否相等時發現不相等,會抛出異常。
無法擷取請求上下文。