官术网_书友最值得收藏!

1.3.5 并發編程

對于任何請求-響應模式下的處理過程,都需要關注請求的響應能力。對于Web請求而言,我們希望服務端能夠快速返回處理結果,從而提高系統的響應能力。而Spring框架也針對這一訴求給出了它的解決方案,這就是并發編程模型。Spring對于并發編程模型的支持包括兩個方面。一方面,Spring提供了@Async注解來實現通用的異步編程能力,并提供了WebAsyncTask組件來實現面向Web的異步處理機制。另一方面,Spring還提供了兩個更高層級的并發編程工具類,即任務執行器TaskExecutor以及任務調度器TaskScheduler。

1. 并發編程的實戰內容

(1)Spring Async

異步處理的主要優勢是調用方不必等待被調用方完成執行過程,因為可以在一個單獨的線程中執行一個方法。我們知道,JDK為開發人員提供了Future、CompletableFuture等支持異步編程的實現工具。而Spring異步編程模型在此基礎上提供了一個全新的@Async注解,該注解可以與JDK中的Future機制以及線程池進行無縫整合。

Spring的@Async注解是通用的,我們可以用它來完成針對任意場景的異步處理流程。隨著Spring Boot的誕生,特定于Web請求處理過程,也出現了WebAsyncTask這一專門的異步任務組件。相較@Async注解,WebAsyncTask為開發人員提供了更靈活的異步任務處理機制。

請注意,異步編程模型是一個相對復雜的話題,很多開發人員只會簡單地使用@Async注解,而不知道其實現原理,這樣就可能導致錯誤地使用該注解。本書將通過分析Spring的源碼來深入理解@Async注解背后的實現原理,避免誤用。

從實戰角度講,Spring Async機制已經為開發人員提供了良好的開發體驗。但是該機制本質上也是對JDK中Future機制的封裝和擴展,而隨著JDK版本的演進,內置的Future機制也在不斷地發展和增強。因此,靈活使用多種Future機制是一種開發技巧。同時,異步編程的背后是對系統線程資源的利用,所以合理設置線程池也是開發人員需要注意的一個實戰點。

(2)Spring任務執行器和調度器

JDK中自帶的執行器(Executor)組件使用起來非常方便,本質上是在所有內部線程管理任務上提供了一個抽象層。而Spring提供TaskExecutor接口作為Executor的擴展,包含了一大批非常有用的實現類。我們會在介紹這些實現類基本功能的同時,給出對TaskExecutor運行原理的分析。

有時候,我們需要以固定的時間間隔執行任務,這就需要引入任務調度的概念。Spring專門針對任務調度場景提供了TaskScheduler組件。基于Spring,我們將看到如何使用@Scheduled注解來對任務進行調度。同樣,我們也將對該注解的實現原理進行講解。

從實戰角度講,Spring框架分別針對不同的應用場景提供了SimpleAsyncTaskExecutor、SyncTaskExecutor、ConcurrentTaskExecutor、ThreadPoolTaskExecutor等TaskExecutor。根據具體需求,靈活使用多種TaskExecutor是一項開發技巧。同時,Spring框架中的@Scheduled注解功能也十分強大,我們可以通過使用各種表達式來制定不同的調度策略。

2. 并發編程的實戰案例

針對Spring的并發編程能力,我們將給出兩個面向不同應用場景的案例分析,即Web異步處理案例分析、基于代理的異步執行模型案例分析。

Spring的@Async注解提供的是一種通用的異步編程模式,可以通過@EnableAsync注解來啟用該功能。而針對Web異步處理需求和場景,我們可以使用WebAsyncTask組件,該組件為開發人員提供了更靈活的異步任務處理流程,并內置了異步回調、超時處理和異常處理機制。我們將通過模擬異步任務執行超時等異常場景來演示WebAsyncTask的各項使用技巧。

Spring的@Async注解本質上是基于動態代理機制實現的,本書也會對這一實現機制進行詳細討論。而在解釋@Async注解的具體原理之前,我們通過一個基于代理的異步編程模型案例來實現一套自定義的、類似@Async注解的異步執行組件,以便更好地理解Spring框架中與異步執行模型相關的設計思想和實現機制。

TaskExecutor和TaskScheduler這兩個工具組件的使用都比較簡單,我們會在這兩個案例中穿插對它們的使用方式的具體描述。

主站蜘蛛池模板: 寿光市| 札达县| 富顺县| 习水县| 广安市| 泸州市| 衡东县| 汝阳县| 宁德市| 扎赉特旗| 宜兰县| 北流市| 广水市| 友谊县| 潜江市| 新和县| 漳州市| 兴城市| 隆回县| 军事| 九台市| 高州市| 阿克苏市| 文成县| 荔浦县| 沁水县| 资阳市| 金湖县| 青川县| 兴文县| 泸定县| 安龙县| 霍城县| 朝阳县| 辽阳市| 黄山市| 贵定县| 赤水市| 喜德县| 马龙县| 博白县|