Spring框架中的異步執行

一、Spring框架中的異步執行

在Spring Framework中分別使用TaskExecutor和TaskScheduler接口提供異步執行和任務調度的抽象,本節我們著重講解基於TaskExecutor支撐的的註解@Async如何實現異步處理的。

二、 @Async註解異步處理原理

在Spring中可以在方法上添加@Async註釋,以便異步調用該方法。換句話說,調用者將在調用含有@Async註釋的方法時立即返回,並且該方法的實際執行將發生在Spring TaskExecutor異步處理器線程中。需要注意的是該註解@Async默認是不會解析的,SpringBoot中需要加上@EnableAsync來啟動。

下面我們看如何使用@Async註解進行異步處理,如下代碼:

Spring框架中的異步執行

如上代碼在方法dosomthingAsync上添加了@Async的註解,所以當我們調用dosomthingAsync方法時候,該方法會馬上返回。

另外使用@Async可以有返回值,因為它們將在運行時由調用者以“正常”方式調用,而不是由容器管理的調度任務TaskExecutor自動調用。例如,以下是使用@Async註解的合法方法:

Spring框架中的異步執行

如上代碼調用該方法後,該方法會馬上返回一個CompletableFuture對象,如果你一直持有這個CompletableFuture對象,那麼等dosomthingAsyncFuture內業務處理異步處理完畢後,就可以從dosomthingAsyncFuture的get()方法獲取到執行結果。

那麼Spring框架是如何做到我們dosomthingAsyncFuture時候會馬上返回一個CompletableFuture那?其實其對該類進行了代理,經過代理後的上面的方法類似於:

Spring框架中的異步執行

Spring會對AsyncTask類使用類似的AsynTaskProxy進行代理,並且會把AsynTask的實例注入到AsynTaskProxy內部,當我們調用AsynTask的dosomthingAsyncFuture方法時候,實際調用的是AsynTaskProxy的dosomthingAsyncFuture方法,後者則使用 CompletableFuture.supplyAsync開啟了一個異步任務(其馬上返回一個 CompletableFuture對象),並且使用默認的SimpleAsyncTaskExecutor線程池做為異步處理線程,然後異步任務內在具體調用了 AsyncTask實例的dosomthingAsyncFuture方法,並且在返回的future上獲取執行結果。

更深入的細節讀者可以翻看AsyncExecutionInterceptor代碼進行研究。


分享到:


相關文章: