在Springboot
中,非同步任務和定時任務是經常遇到的處理問題方式,為了能夠用好這兩項配置,不干擾正常的業務,需要對其進行非同步化配置。怎麼設定合理的非同步處理執行緒就是其核心和關鍵。
在專案中使用非同步任務是經常遇到的解決問題方式,通常是為減少請求的等待時間,將業務處理進行非同步後台處理,可以改善使用者的體驗,增加系統的吞吐量。
在 springboot
中開啟非同步任務,也是十分的簡單,只需要兩個步驟:
#1 開啟@EnableAsync
註解。
2 在需要非同步處理的方法上加入 @Async
。
需要說明的是非同步執行的方法可以有回傳值,但是必須是 Future
,這裡和多執行緒 submit
的方式提交任務,取得處理結果的方式。
到此為止,非同步任務的配置和使用就結束了。非同步任務使用的也是多執行緒執行緒池技術,預設採用的是 SimpleAsyncTaskExecutor
來實現,但是自己的命運怎麼能交到他人手上呢,總覺得不太踏實,異步任務怎麼才能使用自訂的執行緒池去實現呢,這是個好問題,答案也是有的,那就是 AsyncConfigurer
。這是一個介面,需要實作 getAsyncExecutor
方法來取得一個執行緒池,如果需要例外資訊的抓取,則在實作一個方法 getAsyncUncaughtExceptionHandler
即可。
具體的程式碼如下:
#非同步任務執行結果如下,可以說明非同步任務的執行緒池配置已經生效:
定時任務在專案開發中可以說是很常用的配置,作為業務功能的補償而存在,有這舉足輕重的地位,對於定時任務的使用,可以分為固定時間和 crontab
表達式,在實現的工具上,有 spring
自帶的 @Schedule
,在單體專案中應用廣泛,不需要藉助其它的平台和額外的配置,對於簡單的任務來說已經足夠,但是對於分散式系統來說,就有點兒力不從心了,這時就誕生了 quartz、 elastic-job 和xxl-job
等,其中 xxl-job
尤為優秀。在這裡,只介紹 @Schedule
的使用:
1 全域開啟 @EnableScheduling
註解。
2 在需要執行的任務上新增 @Schedule
註解,並指定執行方法,固定執行或採用 cron
表達式。
在實際的專案開發中,crontab
表達式應用還是很廣泛的:
和非同步任務執行一樣,計時任務的執行也是有自己的非同步任務執行緒池,這裡需要實作的介面為 SchedulingConfigurer
,實作其 configureTasks
方法即可:
在一切設定檔做好後,執行後可以看出定時任務的執行緒池設定已經生效:
以上是Springboot非同步任務與定時任務如何處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!