Spring / Spring boot 基於註解非同步程式設計@Async

擁抱心中的夢想發表於2018-06-15

緊接上一篇文章,有大神評論說基於WebSyncTask的非同步任務處理和基於註解@Async的非同步任務處理之間有什麼區別,其實大神評論的時候我也不清楚到底啥區別,所以就去學了一波!藉此機會,總結如下:

一、Spring中註解非同步任務開發步驟

  • 1、在配置類上增加@@EnableAsync註解,並保證Spring能夠掃描得到該註解
  • 2、非同步任務定義,採用@Async定義
  • 3、最後跟呼叫普通方法一樣呼叫非同步任務即可,對於有返回結果的非同步任務值獲取,可通過FutureResult獲取

對於基於註解的非同步任務程式設計示例程式碼,小編已經將程式碼合併到上篇部落格的程式碼中:

程式碼地址為:github.com/SmallerCode…

哈哈,給小編個start嘛!

二、非同步任務基本原理

非同步的概念小編之前也有提及過,很簡單的道理就是我找你辦事,我不用等你把事情辦完,我又可以脫身去做別的事情了,舉個例子就是當你發微信給你朋友,說成留言可能會更準確,等你朋友看到後把事情辦好通知你就可以了。當然對於web請求響應而言,非同步可以理解為將當前處理請求的執行緒釋放掉,後臺偷偷開啟一個執行緒去執行,執行完成之後再返回,讓處理請求的執行緒可以去處理其他進來的請求。

nginx之所以併發那麼優秀,我覺得linux的epoll模型可以瞭解下。還有,可以瞭解下servlet 3.0之後對非同步的支援。

三、非同步任務型別

由於處理請求的執行緒已經被釋放掉,因此要求我們的非同步任務執行緒要和當前請求的上下文進行關聯,才能正常的將資料響應出去。非同步任務不永遠都是順利的,可能有如下三種情況:

  • 1、它可能執行正常且沒有返回值,void宣告
  • 2、它可能會返回某個結果
  • 3、它可能丟擲異常資訊,此時需要我們對異常進行處理

對於獲取返回值處理

採用ResultFuture即可返回一個Future物件,通過Future物件的get方法即可得到返回值。

對於異常資訊處理

基於註解的非同步任務異常處理和基於WebAsynctask不同,前者採用AsyncConfigurer結合自定義異常類AsyncUncaughtExceptionHandler的實現類進行處理。

謝謝閱讀,所有上面講到的程式碼實現,都可以在上面的github地址看到,如有錯誤,歡迎pr,如果對你有幫助,請給個star,麼麼噠!

相關文章