AsyncContext的startAsync()方法開啟異步


Servlet 3.0的異步處理支持特性,使Servlet 線程不再需要一直阻塞,直到業務處理完畢才能再輸出響應,最后才結束該 Servlet 線程。在接收到請求之后,Servlet 線程可以將耗時的操作委派給另一個線程來完成,自己在不生成響應的情況下返回至容器。針對業務處理較耗時的情況,這將大大減少服務器資源的占用,並且提高並發處理速度

1、傳統Servlet處理
Web容器會為每個請求分配一個線程,默認情況下,響應完成前,該線程占用的資源都不會被釋放。若有些請求需要長時間(例如長處理時間運算、等待某個資源),就會長時間占用線程所需資源,若這類請求很多,許多線程資源都被長時間占用,會對系統的性能造成負擔。

2、新特性:異步處理
Servlet 3.0新增了異步處理,可以先釋放容器分配給請求的線程與相關資源,減輕系統負擔,原先釋放了容器所分配線程的請求,其響應將被延后,可以在處理完成(例如長時間運算完成、所需資源已獲得)時再對客戶端進行響應。

Servlet 3.0 之前,一個普通 Servlet 的主要工作流程大致如下:
第一步,Servlet 接收到請求之后,可能需要對請求攜帶的數據進行一些預處理;
第二步,調用業務接口的某些方法,以完成業務處理;
第三步,根據處理的結果提交響應,Servlet 線程結束。
其中第二步的業務處理通常是最耗時的,這主要體現在數據庫操作,以及其它的跨網絡調用等,在此過程中,Servlet 線程一直處於阻塞狀態,直到業務方法執行完畢。在處理業務的過程中,Servlet 資源一直被占用而得不到釋放,對於並發較大的應用,這有可能造成性能的瓶頸。對此,在以前通常是采用私有解決方案來提前結束 Servlet 線程,並及時釋放資源。

Servlet 3.0 針對這個問題做了開創性的工作,現在通過使用 Servlet 3.0 的異步處理支持,之前的 Servlet 處理流程可以調整為如下的過程:
第一步,Servlet 接收到請求之后,可能首先需要對請求攜帶的數據進行一些預處理;
第二步,Servlet 線程將請求轉交給一個異步線程來執行業務處理,線程本身返回至容器,
第三步,Servlet 還沒有生成響應數據,異步線程處理完業務以后,可以直接生成響應數據(異步線程擁有 ServletRequest 和 ServletResponse 對象的引用),或者將請求繼續轉發給其它 Servlet。
Servlet 線程不再是一直處於阻塞狀態以等待業務邏輯的處理,而是啟動異步線程之后可以立即返回。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM