或許,你在Java后端添加異步過程時會這樣處理,然后搖搖大擺、灰溜溜地閃,而實際的運行結果卻並不是我們期望的那樣。那么,現在就將試驗結果記錄如下,以便少走彎路。
(一)在Controller層的公開接口直接添加@Async注解
當前端調用該種接口時會立刻結束,意味着開始即結束,不會在乎該異步接口返回的數據,其實這種接口只適合前端下發命令,后續就不管后端的處理流程了,也不需要后端返回的對象。
(二)在Controller層的私有接口直接添加@Async注解
這種情況是,前端調用后端的公開接口並等待該接口返回,此時在該接口中調用了該層的添加了@Async注解的私有方法,也許你期待的是讓后端接口立刻返回,讓具體的處理過程放在@Async注解的私有函數中,可事實並沒有達到你的效果,添加了@Async注解的私有函數依舊是同步過程,即使你在Controller層的類前面添加了@EnableAsync注解,也無濟於事;所以,這種方式達不到異步的效果。我們可以通過日志來驗證該過程,如下圖所示:
在上圖中,我們看到先進入Controller層公開接口,然后進入帶有@Async注解的私有方法,接着跳出,最后又回到Controller層公開接口,整個流程就是同步過程,此時的@Async注解沒有效果。
(三)在Service層的公開接口直接添加@Async注解
在Controller層提供同步流程的接口,只是在該層中會調用Service層的異步接口,只需要在需要用異步流程完成任務的接口上方添加@Async注解即可,這種策略是可以實現我們的異步過程的,我們還是通過日志來驗證該流程,如下圖所示:
在上圖中,我們看到流程首先進入Controller層,然后立即跳出了Controller層,而Service層的異步接口就是后續完成的任務了,這樣的流程已達到我們想要的異步過程了。
------20200116勉