Tomcat servlet3的非同步化原理理解。

2021-10-25 03:58:46 字數 1785 閱讀 9231

從客戶端發出一次請求至tomcat容器大致經過如下過程:

客戶端發出http請求至tomcat的連線監聽埠;

tomcat connector接收執行緒接收請求,並根據http協議解析該次請求;

tomcat 通過解析的http報文,初始化org.apache.coyote.request,並例項化org.apache.coyote.response;

經裝飾模式轉化為servlet api對應的httpservletrequest與httpservletreponse;

經tomcat的層層容器engine,host,context最終到過我們所寫的業務servlet的service方法;

業務方法service,處理相關的業務邏輯,寫入相應的響應的至response,並返回tomat的容器元件;

tomcat該處理執行緒關閉響應流response並將響應內容返回客戶端;

tomcat該處理執行緒被釋放,然後用於下次請求的處理;

從上面tomcat處理請求過程可知, tomcat處理執行緒一直被占用,直至業務方法處理完畢;那麼servlet3是如何進行非同步化的呢?使用servlet3的非同步的一般姿勢:

asynccontext context = request.startasync(request, response); //第一行

//省略相關的業務處理**

context.complete(); //第三行

當然在使用上面的**之前,不要忘了開啟servlet的非同步化(使用註解也可以):

requestfilter

***true

我們在業務方法中,使用如上的「第一行」**達到如下目的:

將tomcat的該次的處理執行緒進行提前釋放;

也正是由於啟動了該asynccontext,使得tomcat的處理執行緒在釋放的過程中沒有關閉響應(response)流;使得我們在業務**中才能進行後續處理;

提前釋放tomcat的處理執行緒,是為了讓tomcat的執行緒使用率更高,提高吞吐量;不關閉響應流為的是我們在業務中處理了占用長時間的業務操作之後,自己進行響應流的返回並進行關閉,這正是上面「第三行」**作的事情。

所以tomat結合servlet3非同步化的整體請求處理過程大致如下:

客戶端發出http請求至tomcat的連線監聽埠;

tomcat connector接收執行緒接收請求,並根據http協議解析該次請求;

tomcat 通過解析的http報文,例項化org.apache.coyote.request,並例項化org.apache.coyote.response;

經裝飾模式轉化為servlet api對應的httpservletrequest與httpservletreponse;

經tomcat的層層容器engine,host,context最終到過我們所寫的業務servlet的service方法;

業務方法開啟非同步化上下文asyncontext;釋放tomcat當前處理執行緒;

tomcat判斷當前請求是否開啟了非同步化,如果開啟則不關閉響應流response,也不進行使用者響應的返回;

tomcat該執行緒被釋放,然後用於下次請求的處理,提高其吞吐量;

業務方法在asyncontext環境中完成業務方法的處理,呼叫其complete方法,將響應寫回響應流,並關閉響應流,完成此次請求處理.

所以用一句話總結servlet3的基本原理就是:網路連線依舊在,提前釋放tomcat處理執行緒用於提高吞吐量,響應流不關閉,由業務方法自己處理。從這個角度來看基於servlet3的非同步化完全有可能實現真正的服務端push。

專案3 單鏈表的應用(3)

檔名稱 main.cpp,linklist.cpp,linklist.h 完成日期 2015年10月12日 版本號 vc 6.0 問題描述 如下 輸入描述 無 程式輸出 y or n 問題及 3 設計乙個演算法,判斷單鏈表l是否是遞增的。實現這個演算法,並完成測試。ifndef linklist h...

關於 0x3f3f3f3f 的問題

0x3f3f3f3f是乙個很有用的數值,它是滿足以下兩個條件的最大整數。1 整數的兩倍不超過 0x7f7f7f7f,即int能表示的最大正整數。2 整數的每8位 每個位元組 都是相同的。我們在程式設計中經常需要使用 memset a,val,sizeof a 初始化乙個陣列a,該語句把數值 val ...

CSS3的幾個標籤速記3

transition css3過渡 css3裡很好的乙個標籤,可以非常方便的完成需要很多js才能完成的動態效果 例語法 transition width 2s,height 2s,transform 2s css3動畫 keyframes 使一種樣式逐漸變為另一種樣式的過程 1 doctype ht...