1. 程式人生 > >Tutorial中代碼的區別及不同效果

Tutorial中代碼的區別及不同效果

bsp 請求 吞吐量 req async 情況下 情況 gpo t對象

首先, Servlet 處理流程為如下過程:首先,Servlet 接收到請求之後,可能首先需要對請求攜帶的數據進行一些預處理;接著,Servlet 線程將請求轉交給一個異步線程來執行業務處理,線程本身返回至容器,此時 Servlet 還沒有生成響應數據,異步線程處理完業務以後,可以直接生成響應數據(異步線程擁有 ServletRequest 和 ServletResponse 對象的引用),或者將請求繼續轉發給其它 Servlet。如此一來, Servlet 線程不再是一直處於阻塞狀態以等待業務邏輯的處理,而是啟動異步線程之後可以立即返回。

其次,Servlet 3.0的異步處理是通過AsyncContext類來處理的,Servlet可通過ServletRequest的如下兩個方法開啟異步調用、創建AsyncContext對象:

AsyncContext startAsync()

AsyncContext startAsync(ServletRequest, ServletResponse)

重復調用上面的方法將得到同一個AsyncContext對象。AsyncContext對象代表異步處理的上下文,它提供了一些工具方法,可完成設置異步調用的超時時長,dispatch用於請求、啟動後臺線程、獲取request、response對象等功能。

最後,文檔中的request.startAsync()導致請求被異步處理; 在服務方法結束時,響應不會發送到客戶端。acontext.start(new Runnable() {…?})

從容器中獲取新線程。run()內部類的方法的代碼在新線程中執行。內部類可以訪問異步上下文以從請求讀取參數並寫入響應。調用complete()異步上下文的 方法將提交響應並將其發送給客戶端。

運行效果差別:使用異步處理後的例子在大負載的情況下響應速度變快,服務器吞吐量變大。

Tutorial中代碼的區別及不同效果