Tomcat怎么實(shí)現(xiàn)異步Servlet

來自掘金:超人汪小建

??有時(shí)Servlet在生成響應(yīng)報(bào)文前必須等待某些耗時(shí)的操作誊锭,比如在等待一個(gè)可用的JDBC連接或等待一個(gè)遠(yuǎn)程Web服務(wù)的響應(yīng)恬口。對(duì)于這種情況servlet規(guī)范中定義了異步處理方式校读,由于Servlet中等待阻塞會(huì)導(dǎo)致Web容器整體的處理能力低下,所以對(duì)于比較耗時(shí)的操作可以放置到另外一個(gè)線程中進(jìn)行處理祖能,此過程保留連接的請(qǐng)求和響應(yīng)對(duì)象歉秫,在處理完成之后可以把處理的結(jié)果通知到客戶端。

??下面先看Servlet在同步情況下的處理過程养铸,如圖所示雁芙,Tomcat的客戶端請(qǐng)求由管道處理最后會(huì)通過Wrapper容器的管道,這時(shí)它會(huì)調(diào)Servlet實(shí)例的service方法進(jìn)行邏輯處理钞螟,處理完后響應(yīng)客戶端兔甘,整個(gè)處理由Tomcat的Executor線程池的線程處理,而線程池的最大線程數(shù)使有限制的鳞滨,所以這個(gè)處理過程越短裂明、越快把線程讓回線程池就越好。但如果Servlet中的處理邏輯耗時(shí)越長就會(huì)導(dǎo)致長期地占用Tomcat的處理線程池太援,影響Tomcat的整體處理能力闽晦。

Servlet同步處理
Servlet同步處理

??為了解決上面的問題引入了支持異步的Servlet,同樣是客戶端請(qǐng)求到來提岔,然后通過管道最后進(jìn)入到Wrapper容器的管道仙蛉,調(diào)用Servlet實(shí)例的service后,創(chuàng)建一個(gè)異步上下文將耗時(shí)的邏輯操作封裝起來碱蒙,交給用戶自己定義的線程池荠瘪,這時(shí)Tomcat的處理線程就能馬上回到Executor線程池夯巷,而不用等待耗時(shí)的操作完成才讓出線程,從而提升了Tomcat的整體處理能力哀墓。這里要注意的是趁餐,由于后面做完耗時(shí)的操作后還需要對(duì)客戶端響應(yīng),所以需要保持住Request和Response對(duì)象篮绰,以便輸出響應(yīng)報(bào)文到客戶端后雷。

Servlet異步處理
Servlet異步處理

再結(jié)合一個(gè)簡(jiǎn)單的異步代碼來看Tomcat對(duì)Servlet異步的實(shí)現(xiàn):

public class AsyncServlet extends HttpServlet {

    ScheduledThreadPoolExecutor userExecutor = new ScheduledThreadPoolExecutor(5);

    public void doGet(HttpServletRequest req, HttpServletResponse res) {
        AsyncContext aCtx = req.startAsync(req, res);
        userExecutor.execute(new AsyncHandler(aCtx));
    }

}

public class AsyncHandler implements Runnable {

    private AsyncContext ctx;

    public AsyncHandler(AsyncContext ctx) {
        this.ctx = ctx;
    }

    @Override
    public void run() {
        //耗時(shí)操作
        PrintWriter pw;
        try {
            pw = ctx.getResponse().getWriter();
            pw.print("done!");
            pw.flush();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ctx.complete();
    }
}

??我們創(chuàng)建一個(gè)AsyncServlet,它定義了一個(gè)userExecutor線程池專門用于處理該Servlet的所有請(qǐng)求的耗時(shí)的邏輯操作吠各。這樣就不會(huì)占用Tomcat內(nèi)部的Executor線程池臀突,影響到對(duì)其他Servlet的處理。這種思想有點(diǎn)像資源隔離贾漏,耗時(shí)的操作統(tǒng)一由指定的線程池處理候学,而不要影響其它耗時(shí)少的請(qǐng)求處理。
Servlet的異步的實(shí)現(xiàn)就很好理解了纵散,startAsync方法其實(shí)就是創(chuàng)建了一個(gè)異步上下文AsyncContext對(duì)象梳码,該對(duì)象封裝了請(qǐng)求和響應(yīng)對(duì)象。然后創(chuàng)建一個(gè)任務(wù)用于處理耗時(shí)邏輯伍掀,后面通過AsyncContext對(duì)象獲得響應(yīng)對(duì)象并對(duì)客戶端響應(yīng)边翁,輸出“done!”。完成后要通過complete方法告訴Tomcat內(nèi)部我已經(jīng)處理完硕盹,Tomcat就會(huì)請(qǐng)求對(duì)象和響應(yīng)對(duì)象進(jìn)行回收處理或關(guān)閉連接符匾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘩例,隨后出現(xiàn)的幾起案子啊胶,更是在濱河造成了極大的恐慌,老刑警劉巖垛贤,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰坪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡聘惦,警方通過查閱死者的電腦和手機(jī)某饰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來善绎,“玉大人黔漂,你說我怎么就攤上這事≠鹘矗” “怎么了炬守?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剂跟。 經(jīng)常有香客問我减途,道長酣藻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任鳍置,我火速辦了婚禮辽剧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘税产。我一直安慰自己怕轿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布砖第。 她就那樣靜靜地躺著,像睡著了一般环凿。 火紅的嫁衣襯著肌膚如雪梧兼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天智听,我揣著相機(jī)與錄音羽杰,去河邊找鬼。 笑死到推,一個(gè)胖子當(dāng)著我的面吹牛考赛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莉测,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼颜骤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了捣卤?” 一聲冷哼從身側(cè)響起忍抽,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎董朝,沒想到半個(gè)月后鸠项,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡子姜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年祟绊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哥捕。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牧抽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遥赚,到底是詐尸還是另有隱情阎姥,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布鸽捻,位于F島的核電站呼巴,受9級(jí)特大地震影響泽腮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衣赶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一诊赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧府瞄,春花似錦碧磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至货邓,卻和暖如春秆撮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背换况。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工职辨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戈二。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓舒裤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親觉吭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腾供,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司鲜滩,掛了不少台腥,但最終還是拿到小米、百度绒北、阿里黎侈、京東、新浪闷游、CVTE峻汉、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,275評(píng)論 11 349
  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 13,970評(píng)論 22 190
  • 復(fù)習(xí)復(fù)習(xí)!F晖休吠!搞起來!业簿!Servlet和JSP是Java EE規(guī)范最基本成員瘤礁,他們是Java Web開發(fā)的重點(diǎn)知識(shí)...
    JackFrost_fuzhu閱讀 2,849評(píng)論 1 71
  • 自從好好刷牙以來,牙齒開始痛梅尤。以前沒好好刷的時(shí)候它們還好好地呆在那里柜思。一句惡俗的形容“給臉不要臉”岩调。 于是晚上做夢(mèng)...
    親愛的普朗閱讀 675評(píng)論 0 0
  • 椰姑本來叫什么大家都忘了,只是因?yàn)樗矚g說“Yes赡盘,沒問題号枕。”不知是誰起的頭陨享,大家都開始叫她椰姑娘葱淳,這本來...
    玫苑姑娘閱讀 528評(píng)論 0 0